2017-05-25 147 views
0

我正在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錯誤服務器端。這意味着服務器在某處引發異常。 –

回答

2

無需手動反序列化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

真棒!非常感謝。我從來不會想到我自己。現在一切都很完美。再次感謝你。 –