2017-06-29 23 views
0

我目前正在为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 
+0

我试着用提琴手和呼叫传递到服务器,但邮递员我得到了这个错误: “消息”:“该资源不支持请求实体的媒体类型'multipart/form-data'。“, ”ExceptionMessage“:”没有MediaTypeFormatter可用于从媒体类型为'multipart/form-data'的内容中读取'Scanner'类型的对象。“, – kfn

回答

0

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 
+0

这似乎并不能解决问题,我 – kfn

+0

尝试将PutAsJsonAsync方法调用和其他后续方法切换到多行,以查看哪个方法调用是违法者 – pijemcolu

+0

我甚至在没有使用的情况下尝试过它,并且处置了客户端在finally块中,没有变化... – kfn

0

我终于得到它;-)
阅读本我明白为什么后,如何解决它: 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();

,这一切工作得很好, - 我希望有人认为这有用。