我花了3天的时间阅读此处和其他网站上有关的所有文章,涉及此错误,没有成功!现在我需要帮助。
错误:
{StatusCode: 415, ReasonPhrase: 'Unsupported Media Type', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:{
...server's informations...
Strict-Transport-Security: max-age=2592000
X-Android-Received-Millis: 1551400026958
X-Android-Response-Source: NETWORK 415X-
Android-Selected-Protocol: http/1.1
X-Android-Sent-Millis: 1551400026857
X-Powered-By: ASP.NETContent-Length: 0}}
方法:问题出现在: request.postasync(url,param).getawaiter()。getResult();
public static string RegisterPerson(Person p)
{
string msg = "";
string URL = URLbase + "person/register"; //--URL RIGHT, TESTING IN POSTMAN, INSERT DATA NORMALLY
FormUrlEncodedContent param = new FormUrlEncodedContent(new[] {
new KeyValuePair<string, string>("Name", p.Name),
new KeyValuePair<string, string>("Phone", p.Fone),
new KeyValuePair<string, string>("Birth", p.Birth),
});
HttpClient request = new HttpClient();
request.DefaultRequestHeaders.Accept.Clear();
request.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = request.PostAsync(URL, param).GetAwaiter().GetResult(); // <===ERROR HERE
switch (response.StatusCode)
{
case HttpStatusCode.OK:
msg= "SUCCESS";
break;
....
预先感谢您!
这是一个古老的问题,但是由于尚无代码示例中是否存在接受的答案,所以我在此处发布答案。希望像我一样,使用代码示例的这个答案对偶然发现这个问题的其他人有帮助。我在应用程序/json,formurlencodedcontent,content-type标头等之间挣扎了几分钟。如...
选项1,使用PostAsync ...
var url = "https://....your url goes here...";
var param = new Dictionary<string, string>
{
{ "key_one", "value_1" },
{ "key_two", "value_2" }
// ... and so on
};
var content = new FormUrlEncodedContent(param);
var response = _httpClient.PostAsync(url, content);
var result = response.Result.Content.ReadAsStringAsync().Result;
if (!response.Result.IsSuccessStatusCode)
{
throw new Exception(result);
}
return "process result object into anything you need and then return it";
选项2,使用sendAsync ...
var url = "https://....your url goes here...";
var request = new HttpRequestMessage(HttpMethod.Post, new Uri(url));
var param = new Dictionary<string, string>
{
{ "key_one", "value_1" },
{ "key_two", "value_2" }
// ... and so on
};
var content = new FormUrlEncodedContent(param);
request.Content = content;
var response = _httpClient.SendAsync(request);
var result = response.Result.Content.ReadAsStringAsync().Result;
if (!response.Result.IsSuccessStatusCode)
{
throw new Exception(result);
}
return "process result object into anything you need and then return it";
如果任何人要复制/粘贴此代码,请注意,上面的摘要中的_httpclient对象首先在IOC中初始初始化,然后注入构造函数。您可以做到您的需求。自"如何使用IOC"以来这不是这个问题的一部分,我要介绍这个细节。
因此,要首先回答问题,我敢打赌,您需要设置" content-type"标题,因为它抱怨提供了错误的媒体类型(您正在设置自己的内容愿意接受,但不是您要发送的内容)。该服务还期望应用程序/x-www-form-urlencoded编码内容(这是您发送的内容)吗?如果是这样,则可以作为内容类型作为内容类型,但是如今这样做的通常是不太常见的。
这个经典的WebAPI或.NET核心是吗?我问好像是后者,将您的方法更改为非静态,注入IHTTPCLIENTFACTORY,并使用它来构建客户。好处是,您可以创建适合您在注射(startup.cs)中需求的客户并重新使用它们并避免按大规模插座问题(请注意,这需要大量负担,因此,如果这不是您所处的目的不用担心)。但是,它确实使清洁器控制器代码构成了,因此从代码可读性角度来看,这通常是我优化的。