我有一个自托管的WCF服务,它公开了一个带有以下签名的Web POST方法:
[ServiceContract]
public interface IPublisherService
{
[OperationContract]
[WebInvoke(UriTemplate = "Send", Method = "POST")]
void SendMessage(string message);
}
如果我使用具有以下结构(http://localhost:8080/Publisher/Send)的Fiddler发送请求:
WCF返回200 OK,并将响应正确反序列化为JSON:
但是当我尝试从C#控制台应用程序中使用 HttpClient 时,我总是会毫无理由地收到400 Bad Request。 这是请求:
using (HttpClient client = new HttpClient())
{
var content = new StringContent(this.view.Message);
content.Headers.ContentType = new MediaTypeHeaderValue("Application/Json");
var response = client.PostAsync(
new Uri("http://localhost:8080/Publisher/Send"),
content);
var result = response.Result;
this.view.Message = result.ToString();
}
响应始终为400,如果我使用 client.PostAsync 或 clint.SendAsync ,则无关紧要。
StatusCode: 400, ReasonPhrase: 'Bad Request', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
Date: Tue, 29 Dec 2015 12:41:55 GMT
Server: Microsoft-HTTPAPI/2.0
Content-Length: 1647
Content-Type: text/html
}
答案 0 :(得分:1)
我不知道它是否有意义,但答案是我的字符串内容格式不正确。 我已经使用Newtonsoft.Json更改了请求,现在它可以工作:
using (HttpClient client = new HttpClient())
{
var request = new StringContent(
JsonConvert.SerializeObject(this.view.Message),
Encoding.UTF8,
"application/json");
var response = client.PostAsync(
new Uri("http://localhost:8080/Publisher/Send"),
request);
var result = response.Result;
view.Message = result.ToString();
}
答案 1 :(得分:0)
当从数据库中检索数据时,HttpClient请求超过默认的30秒超时时,出现错误400 Bad Request。 sql中的超时增加会有所帮助。