错误500发送JSON POST请求到API

问题描述:

我正在Xamarin.Forms(共享项目库)中开发一个应用程序,它向本地托管的API发送自定义类型列表(只是文档编号和文件类型枚举)。错误500发送JSON POST请求到API

如果我捕捉到JSON字符串,并从邮差送它,一切工作正常,但只要我从应用程序运行httpClient.PostAsync,我收到以下错误:

{StatusCode: 500, ReasonPhrase: 'Internal Server Error', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: { Cache-Control: no-cache Pragma: no-cache Server: Microsoft-IIS/7.5 X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Date: Thu, 25 May 2017 16:00:44 GMT Content-Type: application/json; charset=utf-8 Expires: -1 Content-Length: 36 }}

我不知道我做错了什么。任何人都可以帮忙吗?

类型:

class EmailFiles 
{ 
    public string docNumber { get; set; } 
    public EmailFileTypes.EmailFileType type { get; set; } 
} 

请求:

 List<EmailFiles> files = new List<EmailFiles>(); 

     if (chkShipping.IsToggled) 
     { 
      EmailFiles file = new EmailFiles(); 
      file.type = EmailFileTypes.EmailFileType.CustomerFile; 
      file.docNumber = Helpers.GlobalVariables.gSOLookup.PackList; 
      files.Add(file); 
     } 
     if (chkClosed.IsToggled) 
     { 
      EmailFiles file = new EmailFiles(); 
      file.type = EmailFileTypes.EmailFileType.ClosedFile; 
      file.docNumber = Helpers.GlobalVariables.gSOLookup.Invoice; 
      files.Add(file); 
     } 
     if (chkInvoice.IsToggled) 
     { 
      EmailFiles file = new EmailFiles(); 
      file.type = EmailFileTypes.EmailFileType.Invoice; 
      file.docNumber = Helpers.GlobalVariables.gSOLookup.Invoice; 
      files.Add(file); 
     } 

     string url = SetUrls.urlMtApi + "/api/EmailFile/?emailAddresses=" + strEmails; 

     string strJson = JsonConvert.SerializeObject(files); 
     //Results in: "[{\"docNumber\":\"234273\",\"type\":1},{\"docNumber\":\"633007\",\"type\":2}]" - which works in Postman!! 

     StringContent content = new StringContent(strJson, Encoding.UTF8, "application/json"); 

     HttpClient httpClient = new HttpClient(); 
     HttpResponseMessage response = await httpClient.PostAsync(url, content); 

Web服务:

[System.Web.Http.HttpPost] 
public string EmailFile([FromBody]string jsonfiles, [FromUri] string emailAddresses) 
    { 
     List<EmailFiles> files = JsonConvert.DeserializeObject<List<EmailFiles>>(jsonfiles); 
     ... 
    } 
+1

您需要调试500错误服务器端。这意味着服务器在某处引发异常。 –

无需手动反序列化JSON的身体,只是让模型绑定为你做它通过使用正确的参数:

[System.Web.Http.HttpPost] 
public MyModelReturnType EmailFile([FromBody] List<EmailFiles> files, [FromUri] string emailAddresses) 
{ 
    // the framework has already deserialized the json request for you 
} 

如果使用string,而不是为你的参数的真实模型,服务器将无法对您的请求体绑定到它,因为它会期待一个JSON (用双引号"包围),而这可能会导致模型绑定异常,从而导致客户端发生500错误。

对于返回类型也是如此,只需使用您希望客户端接收的任何类作为返回类型,并且如果要将其发送给Json,则不要使用string

+0

真棒!非常感谢。我从来不会想到我自己。现在一切都很完美。再次感谢你。 –