2017-09-19 126 views
1

我之前發佈了一個類似的帖子,得到了一些很好的答案,但是我不小心刪除了我的帖子,所以我發佈了一些修改後的版本以及更多的數據。將變量發佈到Web API時發生內部服務器錯誤

我正在構建一個Web API來發布並從我的視圖中獲取數據。與API溝通效果很好,但我遇到了一個問題。

每當我發送數據與我的發佈請求,我得到一個500:內部服務器錯誤。如果我從請求中刪除數據,它可以正常工作。

[HttpPost] 
public string Test() 
{ 
    return "this works"; 
} 

,因爲我不傳遞任何數據到我沒有運行任何問題上面的方法:

實例方法的工作原理。但是,每當我一些數據添加到我的要求,比如:

API方法:

[HttpPost] 

public string TestWithVariables(string test) 
{ 
    return test; 
} 

AJAX調用:

$.post({ 
     url: myUrl + "/api/my-api/TestWithVariables", 
     data: { test: "123456" }, 
     success: function (html) { 
      console.log("y") 
     }, 
     error: function() { 
      console.log("n"); 
     } 
    }); 

上面的代碼輸出在瀏覽器中這些錯誤:HTTP/1.1 500內部服務器錯誤和XML解析錯誤:未找到根元素。事情是,如果我在API方法的第一行設置了一個斷點,它永遠不會被命中,這意味着該方法沒有找到,或者由於某種原因執行......?

我嘗試過的一些東西:將我的參數分解爲TestClass並使用[FromBody]。我也嘗試使用[FromUri],這實際上使該方法執行,但我不能從那裏訪問值,因爲我的值張貼在正文中。

任何想法可能會導致這些問題?

+0

是你的路線正確定義? – PmanAce

+0

路由都很好 - 如果我將這些方法從它們被執行的參數上剝離下來。 – maskinen999

+0

使用以下數據:JSON.Stringify({test:「123456」}); –

回答

0

根據您提供的數據,可能的問題可能是: 您沒有使用stringify在ajax請求中將數據轉換爲字符串json。 以下使用

data:JSON.stringify({test:「123456」});

如果它不能共享您可以共享的控制器和其他數據。

+0

或發送完整的url .... myUrl +「/ api/my-api/TestWithVariables」和控制器+授權屬性(如果有的話)。 –

+0

謝謝!我現在在發佈之前將數據串聯起來,但我仍然遇到同樣的問題。 – maskinen999

+0

@ maskinen999你可以給一個嘗試 [使用AllowAnonymous]屬性對你的操作方法 –

0

你可以做的幾件事情,首先確保你將請求的內容類型設置爲json,默認情況下它會是xml,如果你不這樣做的話。

如果您不需要它,也可以完全刪除xml格式化程序。

public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 
      config.MapHttpAttributeRoutes(); 

      config.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{controller}/{id}", 
       defaults: new { id = RouteParameter.Optional } 
      ); 

      config.Formatters.Clear(); 
      config.Formatters.Add(new JsonMediaTypeFormatter()); 
     } 
    } 

這個類居住在App_Start中。

無論哪種方式確保內容類型設置正確。

最後,確認在發送之前字符串化的數據:

var model = JSON.stringify({ test: "123456" }); 

$.post({ 
     url: myUrl + "/api/my-api/TestWithVariables", 
     data: model, 
     success: function (html) { 
      console.log("y") 
     }, 
     error: function() { 
      console.log("n"); 
     } 
    }); 

如果仍然無法正常打控制器然後檢查你的路由。

以不帶參數的POST方法開始。一旦你可以點擊它,添加一個參數,並添加一個[FromBody]屬性。

如果你得到一個500錯誤,這意味着你的地方有一個內部錯誤。在你的方法中加入一個斷點,看看你是否擊中了它。

現在,關於路線。比方說,你的控制器被稱爲SomeController

您的路線將成爲/一些/方法名。 您可以使用控制器上的RoutePrefix屬性和方法上的Route屬性完全控制您的路由。

說實話,我不會有這樣的路徑:/ API /我的API/

是的,它是一個API,它是你沒有必要把在路線。

因此請設置RoutePrefix是API和您的方法途徑是測試PARAM那麼你的URL變爲:/ API /測試PARAM例如

[RoutePrefix("api")] 
public class TestController : ApiController 

    [HttpPost] 
    Route["test-param"] 
    public string TestWithVariables([FromBody] string test) 
    { 
     return test; 
    } 

那麼你的JS:

var model = JSON.stringify({ test: "123456" }); 

$.post({ 
     url: myUrl + "/api/test-param", 
     data: model, 
     contentType: "application/json", 
     success: function (html) { 
      console.log("y") 
     }, 
     error: function() { 
      console.log("n"); 
     } 
    }); 

我不確定contentType的正確語法,但它應該足夠接近我想。

的錯誤處理我個人很喜歡ELMAH,一旦配置它記錄所有的異常,你可以簡單地調用您的網址/ elmad.axd看到很好報告的所有錯誤。

最後一兩件事,它是構建的API時要使用一個很好的客戶端一個好主意。我最喜歡郵差,因爲它可以讓你輕鬆地製作你需要的任何請求。一旦你在郵遞員中得到了所有的工作,那麼你可以簡單地用Javascript來構建這個請求。

+0

你的回答有什麼特別之處? –

+0

感謝您的快速回答。我現在在傳遞數據之前使用JSON.stringify,但我仍然收到相同的錯誤。我還將JSON格式化程序添加到了「WebApiConfig」,但這也沒有幫助。還有其他可能的問題嗎? – maskinen999

+0

添加更多詳情 –

0

控制器:

[HttpPost] 
public string TestWithVariables([FromBody]string test) // added FromBody 
{ 
return test; 
} 

阿賈克斯:

$.post({ 
    url: myUrl + "/api/my-api/TestWithVariables", 
    data: { test: "=123456" }, //prefix data with = sign 
    success: function (html) { 
     console.log("y") 
    }, 
    error: function() { 
     console.log("n"); 
    } 
}); 
相關問題