C# 从web api 2帐户注册表返回错误

C# 从web api 2帐户注册表返回错误,c#,asp.net,json,asp.net-mvc,asp.net-web-api2,C#,Asp.net,Json,Asp.net Mvc,Asp.net Web Api2,我正在尝试使用MVC项目中的account controller调用WebApi 2 account controller中的register account方法。一切正常,但我不知道如何返回错误的MVC项目,如:“密码必须包含大写和小写”等 ASP.NET MVC帐户控制器注册表: // // POST: /Account/Register [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] pu

我正在尝试使用MVC项目中的account controller调用WebApi 2 account controller中的register account方法。一切正常,但我不知道如何返回错误的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);
    }
//
    // 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);
    }
我是MVC和WebApi新手,主要学习教程,这是基本的东西,但我在任何地方都找不到解决方案。我特意将WebApi与项目分开,以便了解这些过程如何更好地工作

我希望解决方案不使用javascript

我假设所有后续请求都需要将承载令牌连接到httpclient,但我认为这是另一个问题

提前感谢您在这方面的帮助

一切正常,但我不知道如何返回错误的MVC项目,如:“密码必须包含大写和小写”等

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

 if (ValidatePasswordPolicy(model.Password))
     {
        return BadRequest("password must contain Upper case and lower case.");
     }
更新:
Asp.net mvc应用程序的
ModelState
验证与
WebAPI
验证存在差异。当您使用
ModelState
将错误放入
WebAPI
时,您必须正确处理响应。正确处理意味着响应是否成功。如果没有,则存在
ModelState
错误或其他错误。下面的代码片段将向您展示如何将错误反序列化为
匿名对象
,并检查是否存在模型状态错误或其他错误。如果出现
ModelState
错误,您只需将它们添加到
Asp.net mvc模型中
,然后返回带有模型的视图以更新带有错误的UI

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
        }
    }
}
if(response.issusccessstatuscode)
{
return wait response.Content.ReadAsAsync();
}
其他的
{
var httpErrorObject=wait response.Content.ReadAsStringAsync();
var Anonomouserobject=
新建{message=”“,ModelState=newdictionary()};
//反序列化:
var反序列化derRorObject=
JsonConvert.DeserializeAnonymousType(httpErrorObject,anonymousErrorObject);
//检查是否确实存在模型错误
if(反序列化derRorObject.ModelState!=null)
{
var误差=
反序列化derRorObject.ModelState
.Select(kvp=>string.Join(“.”,kvp.Value));
对于(int i=0;i
有一篇关于在Asp.net mvc应用程序中处理WebAPI错误的详细文章

一切正常,但我不知道如何返回错误的MVC项目,如:“密码必须包含大写和小写”等

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

 if (ValidatePasswordPolicy(model.Password))
     {
        return BadRequest("password must contain Upper case and lower case.");
     }
更新:
Asp.net mvc应用程序的
ModelState
验证与
WebAPI
验证存在差异。当您使用
ModelState
将错误放入
WebAPI
时,您必须正确处理响应。正确处理意味着响应是否成功。如果没有,则存在
ModelState
错误或其他错误。下面的代码片段将向您展示如何将错误反序列化为
匿名对象
,并检查是否存在模型状态错误或其他错误。如果出现
ModelState
错误,您只需将它们添加到
Asp.net mvc模型中
,然后返回带有模型的视图以更新带有错误的UI

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
        }
    }
}
if(response.issusccessstatuscode)
{
return wait response.Content.ReadAsAsync();
}
其他的
{
var httpErrorObject=wait response.Content.ReadAsStringAsync();
var Anonomouserobject=
新建{message=”“,ModelState=newdictionary()};
//反序列化:
var反序列化derRorObject=
JsonConvert.DeserializeAnonymousType(httpErrorObject,anonymousErrorObject);
//检查是否确实存在模型错误
if(反序列化derRorObject.ModelState!=null)
{
var误差=
反序列化derRorObject.ModelState
.Select(kvp=>string.Join(“.”,kvp.Value));
对于(int i=0;i

有一篇关于在Asp.net mvc应用程序中处理WebAPI错误的详细文章。

返回GetErrorResult(result);我认为您应该执行类似return Request.CreateResponse(HttpStatusCode.Forbidden,GetErrorResult(result))。我不是100%肯定这是api控制器和mvc控制器在同一个项目?如果是这样的话,为什么不直接使用UserManager在mvc控制器中创建用户呢?他们在不同的项目中,打算在不同的机器上测试这一点。您可以添加关于
APIREST
class的详细信息吗?我已经在返回GetErrorResult(result)的问题中添加了整个APIREST类;我认为您应该执行类似return Request.CreateResponse(HttpStatusCode.Forbidden,GetErrorResult(result))。我