use*_*690 11 c# httpclient silverlight-5.0 asp.net-web-api
鉴于此WebApi服务:
[ActionName("KillPerson")]
[HttpPost]
public void KillPerson([FromBody] long id)
{
// Kill
}
Run Code Online (Sandbox Code Playgroud)
而这个HttpClient PostAsync调用:
var httpClient = new HttpClient { BaseAddress = new Uri(ClientConfiguration.ApiUrl) };
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var serializerSettings = new JsonSerializerSettings
{
PreserveReferencesHandling = PreserveReferencesHandling.Objects,
Formatting = Formatting.Indented,
ReferenceLoopHandling = ReferenceLoopHandling.Serialize
};
var serializedParameter = JsonConvert.SerializeObject(parameter, serializerSettings);
var httpContent = new StringContent(serializedParameter, Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync(serviceUrl, httpContent).ConfigureAwait(false);
response.EnsureSuccessStatusCode();
Run Code Online (Sandbox Code Playgroud)
我希望response.EnsureSuccessStatusCode(); 成功,但它会抛出404.有趣的是,fiddler告诉med,webapi服务按预期返回204,当我调试它时,KillPerson运行没有问题.
更新:我已确定只有在客户端代码位于PCL或Silverlight 5项目中时才会发生这种情况.如果我在Windows窗体应用程序中复制它,完全相同的代码将给出预期的204.如果我将Windows窗体应用程序指向PCL中包含的客户端代码,它会给我404 Again.
Update2:这解决了这个问题(尽管让我感到困扰,我不应该这样做):
[ActionName("KillPerson")]
[HttpPost]
public HttpResponseMessage KillPerson([FromBody] long id)
{
return this.Request.CreateResponse(HttpStatusCode.OK);
}
Run Code Online (Sandbox Code Playgroud)
这重新引入了404(小提琴手仍称204和非银光客户端运行正常)
[ActionName("KillPerson")]
[HttpPost]
public HttpResponseMessage KillPerson([FromBody] long id)
{
return this.Request.CreateResponse(HttpStatusCode.NoContent);
}
Run Code Online (Sandbox Code Playgroud)
更新3(已解决):最后想出来了.似乎您可以选择在Silverlight中使用浏览器或客户端HTTP处理.使用浏览器HTTP处理时,许多内容都不受支持 - 包括各种响应代码和标头.在调用HttpClient之前添加这些行修复它:
WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);
WebRequest.RegisterPrefix("https://", WebRequestCreator.ClientHttp);
Run Code Online (Sandbox Code Playgroud)
终于明白了。似乎您可以选择在Silverlight中使用浏览器或客户端HTTP处理。使用浏览器HTTP时,不支持很多处理-包括各种响应代码和标头。在调用HttpClient之前添加以下行可修复此问题:
WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);
WebRequest.RegisterPrefix("https://", WebRequestCreator.ClientHttp);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3049 次 |
| 最近记录: |