Web应用程序不将对Web服务的请求状态反映给用户
本文关键字:Web 状态 给用户 请求 服务 应用程序 | 更新日期: 2023-09-27 18:04:23
EDIT 2
我已经完成了从表单提交到web服务完成执行的代码执行,并且似乎它超时向用户发送电子邮件,这可能意味着我的SMTP客户端详细信息有问题。我会用谷歌试试,看看效果如何。
我正在编写一个web应用程序,它将数据发送到我编写的web服务,该web服务将数据存储在数据库中。
不幸的是,无论post是否成功,web应用程序在提交数据后什么都不做。没有任何迹象表明由于提交而发生了任何事情。
我通过ajax在我的视图上做POST:
$("form").submit(function () {
$.post($(this).attr("action"), $(this).serialize(), function (data) {
if (!data.IsOK) {
DisplayError(data.Title, data.Message, data.Error);
}
else {
window.location.href = '@Url.Content("~/User")';
}
return;
});
return false;
});
我的控制器处理POST到服务器如下:
[HttpPost]
public async Task<ActionResult> Create(User source)
{
if (Request.Cookies["AdminCookie"] == null)
return RedirectToRoute("Home");
if (ModelState.IsValid)
{
try
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://localhost:49474/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = await client.PostAsJsonAsync("api/user", source);
if (response.IsSuccessStatusCode)
{
return Json(new
{
Message = "Success",
IsOK = bool.TrueString
});
}
}
return View();
}
catch(Exception ex)
{
ReportError(ex, "CREATE");
}
}
return View();
}
编辑1
查看此代码时,我突然想到,如果响应状态代码不是成功代码,我就什么也没做,但是,根据经验我也知道,如果是这种情况,我不太可能从响应中获得很多有用的信息。至少不是基于我目前的代码…我该如何改进呢?
结束编辑
正如我们所看到的,一旦成功Json返回到视图,它应该被重定向到相同路由上的"Index"视图,否则,如果有错误,它应该显示我自己设计的错误模态,以告知用户哪里出错了。
public HttpResponseMessage Post([FromBody]User Source)
{
try
{
User u = new User();
u.EmailAddress = Source.EmailAddress;
u.FirstName = Source.FirstName;
u.LastName = Source.LastName;
u.Password = Hashing.CreatePassword(Source.Password);
u.RoleId = Source.RoleId;
u.Role = db.Roles.Single(x => x.Id == u.RoleId);
db.Users.Add(u);
db.SaveChanges();
return Request.CreateResponse(HttpStatusCode.OK);
}
catch (Exception ex)
{
return ReportError(ex, "POST USER");
}
}
private HttpResponseMessage ReportError(Exception ex, string Action = "")
{
StringBuilder sb = new StringBuilder();
sb.AppendLine(String.Format("Error actioning request: [ {0} ]", ex.Message));
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.BadRequest, "Error");
response.Content = new StringContent(ex.ToString(), Encoding.Unicode);
return response;
}
这是我第一次使用web服务,所以我基本上是根据我从一些教程和[似乎]常识中学到的东西来操作的。
我误解了什么吗?我做错了什么?
在这里设置一个断点:HttpResponseMessage response = await client。PostAsJsonAsync("api/user",来源);确保你得到了回应。如果你不是,那么你只是返回一个空视图和"数据"不存在为您的ajax评估IsOk。
[HttpPost]
public async Task<ActionResult> Create(User source)
{
if (Request.Cookies["AdminCookie"] == null)
return RedirectToRoute("Home");
if (ModelState.IsValid)
{
try
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://localhost:49474/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.PostAsJsonAsync("api/user", source); //debug here to ensure you are getting a response
var serializer = new JavaScriptSerializer();
var dataObject = serializer.Deserialize<SomeResponse>(response);
if (dataObject.Success)
{
return Responder("Success", true);
}
}
return Responder();
}
catch(Exception ex)
{
ReportError(ex, "CREATE");
return Responder();
}
}
}
private object Responder(string message = "Did not succeed", bool succeeded = false)
{
return new
{
Message = message,
IsOK = succeeded
};
}
public IHttpActionResult Post([FromBody]User Source)
{
try
{
User u = new User();
u.EmailAddress = Source.EmailAddress;
u.FirstName = Source.FirstName;
u.LastName = Source.LastName;
u.Password = Hashing.CreatePassword(Source.Password);
u.RoleId = Source.RoleId;
u.Role = db.Roles.Single(x => x.Id == u.RoleId);
db.Users.Add(u);
db.SaveChanges();
return new SomeResponse().Success = true;
}
catch (Exception ex)
{
return ReportError(ex, "POST USER");
}
}
public class SomeResponse
{
public bool Success { get; set; }
}