从Web api 2帐户注册返回错误

亚当·H

我试图在MVC项目中使用帐户控制器来调用WebApi 2帐户控制器中的register帐户方法。一切正常,但我无法弄清楚如何将错误返回给MVC项目,例如:“密码必须包含大写和小写”等。

ASP.NET MVC帐户控制器注册:

//
    // POST: /Account/Register
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var response =
            await
                ApiRequest.PostAsync(String.Format("{0}/api/v1/account/register", "http://localhost:12345"), model);

            if (response.IsSuccessStatusCode)
            {
                return RedirectToAction("Index", "Home");

            }
            // Add errors

        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

ApiRequest类:

public static class ApiRequest
{
    public static async Task<HttpResponseMessage> PostAsync(string uri, object item)
    {
        StringContent content = new StringContent(await Json.SerializeAsync(item));
        content.Headers.ContentType = new MediaTypeHeaderValue("text/json");

        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            return await client.PostAsync(new Uri(uri), content);
        }
    }

    public static async Task<HttpResponseMessage> GetAsync(string uri)
    {
        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            return await client.GetAsync(new Uri(uri));
        }
    }

    public static async Task<HttpResponseMessage> PutAsync(string uri, object item)
    {
        StringContent content = new StringContent(await Json.SerializeAsync(item));
        content.Headers.ContentType = new MediaTypeHeaderValue("text/json");

        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            return await client.PutAsync(new Uri(uri), content);
        }
    }

    public static async Task<HttpResponseMessage> DeleteAsync(string uri, object id)
    {
        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            return await client.DeleteAsync(new Uri(String.Format("{0}/{1}", uri, id)));
        }
    }
}

public static class HttpResponseMessageExtensions
{
    public static async Task<T> DeserialiseContentAsync<T>(this HttpResponseMessage message)
        where T : class
    {

        return await Json.DeserialiseAsync<T>(await message.Content.ReadAsStringAsync());
    }
}

Web API 2帐户控制器注册:

//
    // POST: /Account/Register
    [AllowAnonymous]
    [Route("Register")]
    [HttpPost]
    public async Task<IHttpActionResult> Register(RegisterViewModel model)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        var user = new ApplicationUser
        {
            UserName = model.Username,
            Email = model.Email,
            FirstName = model.FirstName,
            LastName = model.LastName
        };

        IdentityResult result = await UserManager.CreateAsync(user, model.Password);

        if (!result.Succeeded)
        {
            if (result.Errors != null)
            {
                foreach (string error in result.Errors)
                {
                    ModelState.AddModelError("", error);
                }
                return BadRequest(ModelState);
            }

            return BadRequest();
        }

        // Send email verification
        //string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);

        //var callbackUrl = new Uri(Url.Link("ConfirmEmail", new { userId = user.Id, code = code }));

        //await
        //    UserManager.SendEmailAsync(user.Id, "Confirm your account",
        //        "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");

        Uri locationHeader = new Uri(Url.Link("GetUserById", new { id = user.Id }));

        return Created(locationHeader, user);
    }

GetErrorResult代码:

private IHttpActionResult GetErrorResult(IdentityResult result)
    {
        if (result == null)
        {
            return InternalServerError();
        }

        if (!result.Succeeded)
        {
            if (result.Errors != null)
            {
                AddErrors(result);
            }

            if (ModelState.IsValid)
            {
                // No ModelState errors are available to send, so just return an empty BadRequest.
                return BadRequest();
            }

            return BadRequest(ModelState);
        }

        return null;
    }

    private void AddErrors(IdentityResult result)
    {
        foreach (string error in result.Errors)
        {
            ModelState.AddModelError("", error);
        }
    }

我是MVC和WebApi的新手,主要是遵循以下教程,这是假定的基本知识,但我在任何地方都找不到解决方案。我有意将WebApi与项目分开,因此我可以了解这些流程如何更好地工作。

我希望解决方案不在javascript中。

我假设所有后续请求都需要在httpclient上附加一个承载令牌,但是我认为这将是另一个问题。

在此先感谢您的任何帮助

仇杀

一切正常,但我无法弄清楚如何将错误返回给MVC项目,例如:“密码必须包含大写和小写”等。

您可以在BadRequest()方法重载中发送自定义消息。在模型上执行自定义验证时,只需返回一条自定义消息。

 if (ValidatePasswordPolicy(model.Password))
     {
        return BadRequest("password must contain Upper case and lower case.");
     }

更新:

和的ModelState验证有所不同当您用来放置错误时,您必须正确处理响应。正确处理意味着响应成功与否。如果不是,则存在错误或其他错误。下面的代码片段将向您展示如何将错误反序列化,并检查是否存在模型状态错误或其他错误。如果发生错误,您可以简单地将它们添加到您的视图中,并返回带有模型的视图以更新具有错误的UI。Asp.net mvc appWebAPIModelStateWebAPIModelStateanonymous objectModelStateAsp.net mvc Model

if (response.IsSuccessStatusCode)
{
    return await response.Content.ReadAsAsync<T>();
}
else
{
    var httpErrorObject = await response.Content.ReadAsStringAsync();
    var anonymousErrorObject =
        new { message = "", ModelState = new Dictionary<string, string[]>() };

    // Deserialize:
    var deserializedErrorObject =
        JsonConvert.DeserializeAnonymousType(httpErrorObject, anonymousErrorObject);

    // Check if there are actually model errors
    if (deserializedErrorObject.ModelState != null)
    {
        var errors =
            deserializedErrorObject.ModelState
                                    .Select(kvp => string.Join(". ", kvp.Value));
        for (int i = 0; i < errors.Count(); i++)
        {
            // Add errors to ModelState in Asp.net mvc app

        }
    }
    // Othertimes, there may not be Model Errors:
    else
    {
        var error =
            JsonConvert.DeserializeObject<Dictionary<string, string>>(httpErrorObject);
        foreach (var kvp in error)
        {
            // Now this is not model error so you can throw exception 
            // or any custom action what ever you like
        }
    }
}

有一个关于从的WebAPI处理错误在Asp.net MVC应用程序的详细文章在这里

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章