鉴于此WebApi服务:
[ActionName("KillPerson")]
[HttpPost]
public void KillPerson([FromBody] long id)
{
    // Kill
}
而这个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();
我希望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);
}
这重新引入了404(小提琴手仍称204和非银光客户端运行正常) …
我已经读过,为了在使用get和post方法时禁用缓存HttpClient,我需要使用a WebRequestHandler作为我HttpClient的HttpClientHandler,并更改其缓存策略.但是,WebRequestHandler不在System.Net.Http.dll中,而是在System.Net.Http.WebRequest.dll中,所以我尝试将.dll添加到项目中作为参考.我收到一条错误消息:
Microsoft Visual Studio
无法将对更高版本或不兼容程序集的引用添加到项目中.
再次,经过一点点搜索后,我得出结论,.dll文件被阻止,因为它是从另一个源下载的.为了解锁它,我继续在这里尝试解决方案.但是,它也没有工作,当我尝试添加.dll文件作为参考时,我仍然得到相同的错误.
我想要做的就是使用我的HttpClient禁用缓存,我在这里做错了吗?我愿意接受任何建议或帮助.
我的系统是Windows 8.1,我正在使用Visual Studio 2013.我正在开发的项目是Windows Phone 8应用程序.我试图引用的.dll目录是"C:\ Windows\Microsoft.NET\Framework\v4.0.30319\System.Net.Http.WebRequest.dll".先感谢您.
我正在开发一个代码,每隔30秒轮询一次Bitstamp交换代码.这是我的代码:
public IObservable<string> Stream(Uri way, WebClient wc)
    {
        Func<IObserver<string>, Task> Fun = async Observer =>
        {
            var res = await wc.DownloadStringTaskAsync(way);
            Observer.OnNext(value: res);
        };
        return Observable.Create<string>(Fun);
    }
public IObservable<string> GetDelay(int secs)
    {
        var exe = TimeSpan.FromSeconds(secs);
        return Observable.Empty<string>("x").Delay(exe);
    }
Stream(new Uri("https://bitstamp.net/api/ticker"), new WebClient { }).Concat(GetDelay(30))
    .Repeat(5).Subscribe(res => Debug.WriteLine("got result: {0}", res));
问题是WebClient(并且HttpClient)也会在第一次调用后返回缓存的结果,可以通过相同的时间戳看到:  
got result: {"high": "690.00", "last": "645.10", "timestamp": "1387715532" ... }
got result: {"high": "690.00", "last": "645.10", "timestamp": "1387715532" ... }
...
即使在关闭网络后,它们也会正常返回结果,所以很明显它们会将其缓存到某处.添加类似"?cache = random"的内容不起作用,因为Bitstamp上的ticker不允许使用请求参数.设置 …
caching webclient httprequest system.reactive windows-phone-8