如何从C#httpclient调用web.api控制器上的HttpPut与.net 4.6
我目前正在为pizzaria,C#和.NET构建web.api 4.6
我有一个C#客户机想要选择比萨饼从代码..比萨是在JSON。如何从C#httpclient调用web.api控制器上的HttpPut与.net 4.6
{"id":1,"Name":"Magariatha"}
我从一个以iis express托管的asp.net站点打电话,我没打通。 如果我从提琴手呼叫,该呼叫通过,而比萨饼被选中,可以得到有序;-)
我PizzaController样子:
public HttpResponseMessage Put(Pizza pizza)
{
string pizzaApi = "Api/Pizza/";
var handler = new WebRequestHandler() {
AllowAutoRedirect = false,
UseProxy = false };
using(var client = new HttpClient(handler)) {
client.BaseAdresse = new Uri("http://localhost:12345");
var media = new MediaTypeWithQualityHeaderValue("application/json");
client.DefaultRequestHeaders.Accept.Add(media);
// so far so good, but the trouble starts in the next line...
return client.PutAsJsonAsync(pizzaApi, pizza).
ContinueWith(x => x.Result.EnsureSuccessStatusCode)).Result;
} // end using
} // end put
看来,得到的东西放置在调用putasjson,在服务器被访问之前。但我想不出为什么。我得到的消息:
Exception thrown: 'System.ObjectDisposedException' in System.Net.Http.dll
TL;博士: 通过分割违规调用到多个不同的电话很明显,有手头一个完全不同的问题与ACCES权利。这个答案的其余部分只是OPs问题答案的一个旅程。
的问题是,因为你是在返回之前关闭使用语句块,它实际上被关闭之前返回,然后客户对象是已经布置和其上的任何进一步调用导致异常。
我们也发现在client.BaseAddress然后是apicall地址有奇怪的要求,因为这家伙(Why is HttpClient BaseAddress not working?)已经找到了困难的方式。
string pizzaApi = "Api/Pizza"; // no slash at the end
client.BaseAddress = new Uri("http://localhost:12345/") // slash at the end
您应该从使用块外部拉出结果变量,并在需要时关闭它,然后返回结果。
public HttpResponseMessage Put(Pizza pizza)
{
string pizzaApi = "Api/Pizza";
var handler = new WebRequestHandler() {
AllowAutoRedirect = false,
UseProxy = false };
// no clue what type this should be so change var to the type accordingly
var result;
using(var client = new HttpClient(handler))
{
client.BaseAdresse = new Uri("http://localhost:12345/");
var media = new MediaTypeWithQualityHeaderValue("application/json");
client.DefaultRequestHeaders.Accept.Add(media);
result = client.PutAsJsonAsync(pizzaApi, pizza).
ContinueWith(x => x.Result.EnsureSuccessStatusCode)).Result;
} // end using here instead
return result;
} // end put
我终于得到它;-)
阅读本我明白为什么后,如何解决它: http://chimera.labs.oreilly.com/books/1234000001708/ch14.html#_peeling_off_the_layers
的问题是,是的,我使用HttpClient的using语句里面, 它会自动清理,并在时间之前处理WebRequestHandler。但有一个解决方法!
有给带有布尔构造,如果处置是自动化的,其控制一个可选的第二个参数。 Appearently所有我需要做的是使用构造和处理与处理程序的优化配置手动;-) ... VAR处理器=新WebRequestHandler(); ... 使用(var client = new HttpClient(handler,false)){// < FALSE ADDED !!! ... } handler.Dispose();
,这一切工作得很好, - 我希望有人认为这有用。
我试着用提琴手和呼叫传递到服务器,但邮递员我得到了这个错误: “消息”:“该资源不支持请求实体的媒体类型'multipart/form-data'。“, ”ExceptionMessage“:”没有MediaTypeFormatter可用于从媒体类型为'multipart/form-data'的内容中读取'Scanner'类型的对象。“, – kfn