C# 如何处理WebClient响应以向用户显示错误消息?

C# 如何处理WebClient响应以向用户显示错误消息?,c#,asp.net-mvc,asp.net-web-api,C#,Asp.net Mvc,Asp.net Web Api,我正在开发一个调用Web API的MVC Web应用程序。在我的Create(POST)方法中,用户将在数据库中输入一些用户的电子邮件地址。只有在数据库中不存在或不存在该电子邮件时,我才有权输入该电子邮件。如果它已经存在,我希望能够向用户显示一条错误消息“电子邮件已经存在” 我不知道如何处理响应,以便在无法创建approveduser时向用户显示错误消息?我正在尝试一个try catch案例,但它不起作用。我有ViewBag.Message=error,当它失败时,我试图在索引视图中显示它。但什

我正在开发一个调用Web API的MVC Web应用程序。在我的Create(POST)方法中,用户将在数据库中输入一些用户的电子邮件地址。只有在数据库中不存在或不存在该电子邮件时,我才有权输入该电子邮件。如果它已经存在,我希望能够向用户显示一条错误消息“电子邮件已经存在”

我不知道如何处理响应,以便在无法创建approveduser时向用户显示错误消息?我正在尝试一个
try catch
案例,但它不起作用。我有
ViewBag.Message=error
,当它失败时,我试图在索引视图中显示它。但什么都没有表现出来。当我调试时,它甚至不会转到
catch
,当电子邮件存在于数据库中时,它只会将我带到索引视图

public ActionResult Create([Bind(Include = "Email,FirstName,LastName")] ApprovedUsers approvedUsers)
{
    try
    {
        using (WebClient client = new WebClient())
        {
            token = Session.GetDataFromSession<string>("access_token");
            client.Headers.Add("authorization", "Bearer " + token);
            byte[] response = client.UploadValues(apiUrl, "POST", new NameValueCollection()
            {
                { "Email", approvedUsers.Email },
                { "FirstName",approvedUsers.FirstName },
                { "LastName",approvedUsers.LastName }
            });

            string result = System.Text.Encoding.UTF8.GetString(response);
            return RedirectToAction("Index");
        }
    }
    catch
    {
        return RedirectToAction("Index", new { error = "Email exists" });
    }
}
这是正在调用的API方法

public IHttpActionResult PostApprovedUsers(ApprovedUsers approvedUsers)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

if (!db.ApprovedUsers.Any(u => u.Email == approvedUsers.Email))
{
    db.ApprovedUsers.Add(approvedUsers);
    db.SaveChanges();
}
return CreatedAtRoute("DefaultApi", new { id = approvedUsers.Email }, approvedUsers);  
试试这个:

public ActionResult Create([Bind(Include = "Email,FirstName,LastName")] ApprovedUsers approvedUsers)
{ 
    try
    {
        using (WebClient client = new WebClient())
        {
            token = Session.GetDataFromSession<string>("access_token");
            client.Headers.Add("authorization", "Bearer " + token);
            byte[] response = client.UploadValues(apiUrl, "POST", new NameValueCollection()
            {
                { "Email", approvedUsers.Email },
                { "FirstName",approvedUsers.FirstName },
                { "LastName",approvedUsers.LastName }
            });

            string result = System.Text.Encoding.UTF8.GetString(response);            
        }
    }
    catch
    {
       TempData["Error"] = "Email Exists";});
    }

  RedirectToAction("Index");

 }

public ViewResult Index(string sortOrder, string currentFilter, string searchString, int? page, string error)
  {
      ViewBag.Message = TempData["Error"].ToString();
  }
public ActionResult Create([Bind(Include=“Email,FirstName,LastName”)]ApprovedUsers ApprovedUsers)
{ 
尝试
{
使用(WebClient=newWebClient())
{
token=Session.GetDataFromSession(“访问令牌”);
client.Headers.Add(“授权”、“持有人”+令牌);
byte[]response=client.UploadValues(APIRL,“POST”,new-NameValueCollection())
{
{“Email”,approvedUsers.Email},
{“FirstName”,approvedUsers.FirstName},
{“LastName”,approvedUsers.LastName}
});
字符串结果=System.Text.Encoding.UTF8.GetString(响应);
}
}
抓住
{
TempData[“Error”]=“电子邮件存在”;});
}
重定向操作(“索引”);
}
公共视图结果索引(字符串排序器、字符串currentFilter、字符串searchString、int?页、字符串错误)
{
ViewBag.Message=TempData[“Error”].ToString();
}
试试这个:

public ActionResult Create([Bind(Include = "Email,FirstName,LastName")] ApprovedUsers approvedUsers)
{ 
    try
    {
        using (WebClient client = new WebClient())
        {
            token = Session.GetDataFromSession<string>("access_token");
            client.Headers.Add("authorization", "Bearer " + token);
            byte[] response = client.UploadValues(apiUrl, "POST", new NameValueCollection()
            {
                { "Email", approvedUsers.Email },
                { "FirstName",approvedUsers.FirstName },
                { "LastName",approvedUsers.LastName }
            });

            string result = System.Text.Encoding.UTF8.GetString(response);            
        }
    }
    catch
    {
       TempData["Error"] = "Email Exists";});
    }

  RedirectToAction("Index");

 }

public ViewResult Index(string sortOrder, string currentFilter, string searchString, int? page, string error)
  {
      ViewBag.Message = TempData["Error"].ToString();
  }
public ActionResult Create([Bind(Include=“Email,FirstName,LastName”)]ApprovedUsers ApprovedUsers)
{ 
尝试
{
使用(WebClient=newWebClient())
{
token=Session.GetDataFromSession(“访问令牌”);
client.Headers.Add(“授权”、“持有人”+令牌);
byte[]response=client.UploadValues(APIRL,“POST”,new-NameValueCollection())
{
{“Email”,approvedUsers.Email},
{“FirstName”,approvedUsers.FirstName},
{“LastName”,approvedUsers.LastName}
});
字符串结果=System.Text.Encoding.UTF8.GetString(响应);
}
}
抓住
{
TempData[“Error”]=“电子邮件存在”;});
}
重定向操作(“索引”);
}
公共视图结果索引(字符串排序器、字符串currentFilter、字符串searchString、int?页、字符串错误)
{
ViewBag.Message=TempData[“Error”].ToString();
}

是我的API导致了这个问题。即使它无法创建重复的电子邮件,它也从未转到
catch
,因为如果数据库中确实存在该电子邮件,则我没有收到错误的请求返回

将我的API更改为这个,然后它就开始工作了

if (db.ApprovedUsers.Any(u => u.Email == approvedUsers.Email))
{
    return Content(HttpStatusCode.BadRequest, "Email exists already");
}
else
{
    db.ApprovedUsers.Add(approvedUsers);
}
   try
   {
      db.SaveChanges();
   }
   catch (DbUpdateException e)
   {
      if (ApprovedUsersExists(approvedUsers.Id))
       {
          return Conflict();
       }
       throw e;

是我的API导致了这个问题。即使它无法创建重复的电子邮件,它也从未转到
catch
,因为如果数据库中确实存在该电子邮件,则我没有收到错误的请求返回

将我的API更改为这个,然后它就开始工作了

if (db.ApprovedUsers.Any(u => u.Email == approvedUsers.Email))
{
    return Content(HttpStatusCode.BadRequest, "Email exists already");
}
else
{
    db.ApprovedUsers.Add(approvedUsers);
}
   try
   {
      db.SaveChanges();
   }
   catch (DbUpdateException e)
   {
      if (ApprovedUsersExists(approvedUsers.Id))
       {
          return Conflict();
       }
       throw e;

只是想知道索引操作看起来像什么?我在我的帖子中添加了索引视图结果中的一部分代码。这就是你们要问的吗?把断点放在索引的条目上。查找您试图传递的内容。您正试图将对象传递给不接受对象的方法。取而代之的是:stringsortorder、stringcurrentfilter、stringsearchstring、int?页面,字符串错误。例如,如果您有一个错误字符串参数,则可以传入该参数。但是一般来说,对于这么多的参数,最好创建一个模型并在insted中传递它。当我没有使用try&catch时,它正在索引页中显示消息。与创建用户时一样,视图也显示了错误字符串。我有那么多参数,因为我正在对索引页表进行分页、搜索筛选和排序。如果用户存在,您的
postprovedUsers
不会返回错误,您需要返回某种错误状态代码(类似于
BadRequest
),它才能命中
catch
块,否则,它会将结果视为非错误结果,并按预期重定向到索引操作。只是想知道索引操作是什么样子吗?我在帖子中添加了索引视图结果中的一部分代码。这就是你们要问的吗?把断点放在索引的条目上。查找您试图传递的内容。您正试图将对象传递给不接受对象的方法。取而代之的是:stringsortorder、stringcurrentfilter、stringsearchstring、int?页面,字符串错误。例如,如果您有一个错误字符串参数,则可以传入该参数。但是一般来说,对于这么多的参数,最好创建一个模型并在insted中传递它。当我没有使用try&catch时,它正在索引页中显示消息。与创建用户时一样,视图也显示了错误字符串。我有那么多参数,因为我正在对索引页表进行分页、搜索筛选和排序。如果用户存在,您的
postprovedUsers
不会返回错误,您需要返回某种错误状态代码(类似于
BadRequest
),它才能命中
catch
块,否则,它会将结果视为非错误结果,并按预期重定向到索引操作