Web应用程序不会将对Web服务的请求状态反映给用户

时间:2015-07-24 11:45:10

标签: c# ajax asp.net-mvc web-services asp.net-web-api2

编辑2
我已经完成了从表单提交到Web服务执行完成的代码执行,似乎超时向用户发送电子邮件,这可能意味着我的SMTP客户端详细信息。我会尝试谷歌,看看它是如何工作的。
结束编辑2

我正在编写一个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;
});

My Controller按如下方式处理服务器的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返回到View,它应该被重定向到同一路径上的“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服务,因此我几乎按照我从一些教程和[似乎]常识中学到的东西进行操作。

我在这里误解了什么吗?我做错了什么?

1 个答案:

答案 0 :(得分:0)

在此处设置断点:HttpResponseMessage response = await client.PostAsJsonAsync(&#34; api / user&#34;,source);并确保您收到回复。如果你不是那么你只是返回一个空视图和&#34;数据&#34;您的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; }
}