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服务,所以我基本上是根据我从一些教程和[似乎]常识中学到的东西来操作的。

我误解了什么吗?我做错了什么?

Web应用程序不将对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; }
}