簡體   English   中英

C#WebClient使用UploadString從C#中的ApiController調用HttpPost方法。 415或400錯誤

[英]C# WebClient using UploadString to call HttpPost method from an ApiController also in C#. 415 or 400 error

我希望在C#中也可以在C#中調用ApiController,但是當使用WebClient實例中的UploadString方法上傳Json時,我得到錯誤415或400。

服務器代碼是自動生成的調用TestController。 該文件正是Visual Studio 2019生成它的方式。

[Route("api/[controller]")]
[ApiController]
public class TestController : ControllerBase
{
    // GET: api/Test
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // POST: api/Test
    [HttpPost]
    public void Post([FromBody] string value)
    {
    }
    ...
}

客戶端代碼如下所示:

WebClient client = new WebClient();
client.UploadString("https://localhost:44345/api/Test", "ABC");   // Edit: "ABC" is not a valid JSON

我收到System.Net.WebException:'遠程服務器返回錯誤:(415)不支持的媒體類型。'

所以在谷歌搜索之后,大多數建議是ContentType沒有指定,如果我添加

client.Headers[HttpRequestHeader.ContentType] = "application/json";

我得到System.Net.WebException:'遠程服務器返回錯誤:(400)錯誤請求。

任何線索?

好像問題與POST / PUT / PATCH ......如果我做GET ,它正在工作並返回示例數據["value1","value2"]

編輯:我不是堅持使用WebClient.UploadString方法,但我想要一個不涉及25行自定義代碼的解決方案......我的意思是我無法相信它在jQuery中可以做到這一點很難單行。

我收到System.Net.WebException:'遠程服務器返回錯誤:(415)不支持的媒體類型。'

使用[FromBody] ,將使用Content-Type標頭來確定如何解析請求正文。 如果未指定Content-Type ,則模型綁定過程不知道如何使用正文,因此返回415。

我得到System.Net.WebException:'遠程服務器返回錯誤:(400)錯誤請求。

通過將Content-Type標頭設置為application/json ,您將指示模型綁定過程將數據視為JSON,但ABC本身不是有效的JSON。 如果您只想發送一個JSON編碼的字符串,您也可以將值包裝在引號中,如下所示:

client.UploadString("https://localhost:44345/api/Test", "\"ABC\"");

"ABC"是一個有效的JSON字符串,將由您的ASP.NET Core API接受。

簡單解決方案

調用API時在標頭中指定Content-type

            WebClient client = new WebClient();
            client.Headers.Add("Content-Type", "text/json");
            client.UploadString("https://localhost:44345/api/Test", "\"ABC\"");

編輯:

不要使用[From_Body]屬性,因為它具有可怕的錯誤處理功能,請參閱此處

如果請求正文有任何無效輸入(語法錯誤,不支持的輸入),那么它將針對錯誤請求和不支持的內容拋出400415 出於同樣的原因,它可能需要null作為來自請求體的輸入,它不理解格式。

因此,刪除該屬性並嘗試以純格式上傳字符串,因為它只接受String,並且您不需要在發出請求時指定Content-Type屬性。

[HttpPost]
 public void Post(string value)
 {

 }

這就像你在原帖中所說的一樣。

WebClient client = new WebClient();
client.UploadString("https://localhost:44345/api/Test", "ABC");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM