我试图创建一个将url作为参数并从中返回GET响应的函数,它只是在WebResponse responseObject intialization
行中给出了一个错误
例外是An exception of type 'System.Net.ProtocolViolationException' occurred in mscorlib.ni.dll but was not handled in user code
public static async Task<string> get(string url)
{
var request = WebRequest.Create(new Uri(url)) as HttpWebRequest;
request.Method = "GET";
request.ContentType = "application/json";
WebResponse responseObject = await Task<WebResponse>.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, request);
var responseStream = responseObject.GetResponseStream();
var sr = new StreamReader(responseStream);
string received = await sr.ReadToEndAsync();
return received;
}
答案 0 :(得分:6)
您无法为GET请求设置ContentType
,因为您没有向服务器发送任何数据。
Content-Type =请求正文的MIME类型(与POST和PUT请求一起使用)。
这是ProtocolViolationException
的来源。
看起来您想要设置Accept
标题。
接受=内容 - 响应可接受的类型
(根据Wikipedia)
尝试将代码更改为:
request.Accept = "application/json";
答案 1 :(得分:2)
尝试使用HttpClient,而不是这样:
public async Task<List<MyClass>> GetMyClassAsync(
CancellationToken cancelToken = default(CancellationToken))
{
using (HttpClient httpClient = new HttpClient())
{
var uri = Util.getServiceUri("myservice");
var response = await httpClient.GetAsync(uri, cancelToken);
return (await response.Content.ReadAsAsync<List<MyClass>>());
}
}