C# 为什么我会收到HttpWebResponse的错误请求(代码400)?
我正在向WCF服务器应用程序发送一条简单的json消息 Json消息:C# 为什么我会收到HttpWebResponse的错误请求(代码400)?,c#,.net,json,wcf,webrequest,C#,.net,Json,Wcf,Webrequest,我正在向WCF服务器应用程序发送一条简单的json消息 Json消息: {"Name":"Julian", "Id":123} public string MakeRequest(string parameters) { Console.WriteLine("parameters:" + parameters); var request = (HttpWebRequest)WebRequest.Create(EndPoint); request
{"Name":"Julian", "Id":123}
public string MakeRequest(string parameters)
{
Console.WriteLine("parameters:" + parameters);
var request = (HttpWebRequest)WebRequest.Create(EndPoint);
request.Method = Method.ToString();
request.ContentLength = 0;
request.ContentType = ContentType;
Console.WriteLine("request: " + request.Headers.ToString());
if (PostData != null && Method == HttpVerb.POST)
{
var encoding = new UTF8Encoding();
var bytes = ObjectToByteArray(PostData);
request.ContentLength = bytes.Length;
Console.WriteLine("Content length: " + request.ContentLength);
using (var writeStream = request.GetRequestStream())
{
writeStream.Write(bytes, 0, bytes.Length);
}
}
try
{
using (var response = (HttpWebResponse)request.GetResponse())
{
var responseValue = string.Empty;
if (response.StatusCode != HttpStatusCode.OK)
{
var message = String.Format("Request failed. Received HTTP {0}", response.StatusCode);
throw new ApplicationException(message);
}
// grab the response
using (var responseStream = response.GetResponseStream())
{
if (responseStream != null)
using (var reader = new StreamReader(responseStream))
{
responseValue = reader.ReadToEnd();
}
}
return responseValue;
}
}
catch (WebException exception)
{
string responseText;
using (var reader = new StreamReader(exception.Response.GetResponseStream()))
{
responseText = reader.ReadToEnd();
return responseText;
}
}
private byte[] ObjectToByteArray(object obj)
{
if (obj == null)
return null;
BinaryFormatter bf = new BinaryFormatter();
using (MemoryStream ms = new MemoryStream())
{
bf.Serialize(ms, obj);
return ms.ToArray();
}
}
[WebInvoke(Method = "POST",
ResponseFormat = WebMessageFormat.Json,
RequestFormat =WebMessageFormat.Json,
UriTemplate = "/postdata")]
public Person PostData(Person data)
{
//Return new person with data inputted from json message
return new Person()
{
Id = data.Id,
Name = data.Name
};
}
var request = (HttpWebRequest)WebRequest.Create(EndPoint);
request.Method = Method.ToString();
request.ContentLength = 0;
request.ContentType = ContentType;
Console.WriteLine("request: " + request.Headers.ToString());
if (PostData != null && Method == HttpVerb.POST)
{
Console.WriteLine("json length: " + json.Length);
Console.WriteLine(json);
request.ContentLength = json.Length;
var encoding = new UTF8Encoding();
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
streamWriter.Write(json);
streamWriter.Flush();
streamWriter.Close();
}
}
try
{
// **** FIRST READ USING request.GetResponse() ****
//var httpResponse = (HttpWebResponse)request.GetResponse();
//using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
//{
// streamReader.ReadToEnd();
//}
using (var response = (HttpWebResponse)request.GetResponse())
{
var responseValue = string.Empty;
if (response.StatusCode != HttpStatusCode.OK)
{
var message = String.Format("Request failed. Received HTTP {0}", response.StatusCode);
throw new ApplicationException(message);
}
// grabs the response
using (var responseStream = response.GetResponseStream())
{
if (responseStream != null)
using (var reader = new StreamReader(responseStream))
{
// **** SECOND READ USING response.GetResponseStream() ****
responseValue = reader.ReadToEnd();
}
}
return responseValue;
}
}
客户端代码:
{"Name":"Julian", "Id":123}
public string MakeRequest(string parameters)
{
Console.WriteLine("parameters:" + parameters);
var request = (HttpWebRequest)WebRequest.Create(EndPoint);
request.Method = Method.ToString();
request.ContentLength = 0;
request.ContentType = ContentType;
Console.WriteLine("request: " + request.Headers.ToString());
if (PostData != null && Method == HttpVerb.POST)
{
var encoding = new UTF8Encoding();
var bytes = ObjectToByteArray(PostData);
request.ContentLength = bytes.Length;
Console.WriteLine("Content length: " + request.ContentLength);
using (var writeStream = request.GetRequestStream())
{
writeStream.Write(bytes, 0, bytes.Length);
}
}
try
{
using (var response = (HttpWebResponse)request.GetResponse())
{
var responseValue = string.Empty;
if (response.StatusCode != HttpStatusCode.OK)
{
var message = String.Format("Request failed. Received HTTP {0}", response.StatusCode);
throw new ApplicationException(message);
}
// grab the response
using (var responseStream = response.GetResponseStream())
{
if (responseStream != null)
using (var reader = new StreamReader(responseStream))
{
responseValue = reader.ReadToEnd();
}
}
return responseValue;
}
}
catch (WebException exception)
{
string responseText;
using (var reader = new StreamReader(exception.Response.GetResponseStream()))
{
responseText = reader.ReadToEnd();
return responseText;
}
}
private byte[] ObjectToByteArray(object obj)
{
if (obj == null)
return null;
BinaryFormatter bf = new BinaryFormatter();
using (MemoryStream ms = new MemoryStream())
{
bf.Serialize(ms, obj);
return ms.ToArray();
}
}
[WebInvoke(Method = "POST",
ResponseFormat = WebMessageFormat.Json,
RequestFormat =WebMessageFormat.Json,
UriTemplate = "/postdata")]
public Person PostData(Person data)
{
//Return new person with data inputted from json message
return new Person()
{
Id = data.Id,
Name = data.Name
};
}
var request = (HttpWebRequest)WebRequest.Create(EndPoint);
request.Method = Method.ToString();
request.ContentLength = 0;
request.ContentType = ContentType;
Console.WriteLine("request: " + request.Headers.ToString());
if (PostData != null && Method == HttpVerb.POST)
{
Console.WriteLine("json length: " + json.Length);
Console.WriteLine(json);
request.ContentLength = json.Length;
var encoding = new UTF8Encoding();
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
streamWriter.Write(json);
streamWriter.Flush();
streamWriter.Close();
}
}
try
{
// **** FIRST READ USING request.GetResponse() ****
//var httpResponse = (HttpWebResponse)request.GetResponse();
//using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
//{
// streamReader.ReadToEnd();
//}
using (var response = (HttpWebResponse)request.GetResponse())
{
var responseValue = string.Empty;
if (response.StatusCode != HttpStatusCode.OK)
{
var message = String.Format("Request failed. Received HTTP {0}", response.StatusCode);
throw new ApplicationException(message);
}
// grabs the response
using (var responseStream = response.GetResponseStream())
{
if (responseStream != null)
using (var reader = new StreamReader(responseStream))
{
// **** SECOND READ USING response.GetResponseStream() ****
responseValue = reader.ReadToEnd();
}
}
return responseValue;
}
}
服务器端代码:
{"Name":"Julian", "Id":123}
public string MakeRequest(string parameters)
{
Console.WriteLine("parameters:" + parameters);
var request = (HttpWebRequest)WebRequest.Create(EndPoint);
request.Method = Method.ToString();
request.ContentLength = 0;
request.ContentType = ContentType;
Console.WriteLine("request: " + request.Headers.ToString());
if (PostData != null && Method == HttpVerb.POST)
{
var encoding = new UTF8Encoding();
var bytes = ObjectToByteArray(PostData);
request.ContentLength = bytes.Length;
Console.WriteLine("Content length: " + request.ContentLength);
using (var writeStream = request.GetRequestStream())
{
writeStream.Write(bytes, 0, bytes.Length);
}
}
try
{
using (var response = (HttpWebResponse)request.GetResponse())
{
var responseValue = string.Empty;
if (response.StatusCode != HttpStatusCode.OK)
{
var message = String.Format("Request failed. Received HTTP {0}", response.StatusCode);
throw new ApplicationException(message);
}
// grab the response
using (var responseStream = response.GetResponseStream())
{
if (responseStream != null)
using (var reader = new StreamReader(responseStream))
{
responseValue = reader.ReadToEnd();
}
}
return responseValue;
}
}
catch (WebException exception)
{
string responseText;
using (var reader = new StreamReader(exception.Response.GetResponseStream()))
{
responseText = reader.ReadToEnd();
return responseText;
}
}
private byte[] ObjectToByteArray(object obj)
{
if (obj == null)
return null;
BinaryFormatter bf = new BinaryFormatter();
using (MemoryStream ms = new MemoryStream())
{
bf.Serialize(ms, obj);
return ms.ToArray();
}
}
[WebInvoke(Method = "POST",
ResponseFormat = WebMessageFormat.Json,
RequestFormat =WebMessageFormat.Json,
UriTemplate = "/postdata")]
public Person PostData(Person data)
{
//Return new person with data inputted from json message
return new Person()
{
Id = data.Id,
Name = data.Name
};
}
var request = (HttpWebRequest)WebRequest.Create(EndPoint);
request.Method = Method.ToString();
request.ContentLength = 0;
request.ContentType = ContentType;
Console.WriteLine("request: " + request.Headers.ToString());
if (PostData != null && Method == HttpVerb.POST)
{
Console.WriteLine("json length: " + json.Length);
Console.WriteLine(json);
request.ContentLength = json.Length;
var encoding = new UTF8Encoding();
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
streamWriter.Write(json);
streamWriter.Flush();
streamWriter.Close();
}
}
try
{
// **** FIRST READ USING request.GetResponse() ****
//var httpResponse = (HttpWebResponse)request.GetResponse();
//using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
//{
// streamReader.ReadToEnd();
//}
using (var response = (HttpWebResponse)request.GetResponse())
{
var responseValue = string.Empty;
if (response.StatusCode != HttpStatusCode.OK)
{
var message = String.Format("Request failed. Received HTTP {0}", response.StatusCode);
throw new ApplicationException(message);
}
// grabs the response
using (var responseStream = response.GetResponseStream())
{
if (responseStream != null)
using (var reader = new StreamReader(responseStream))
{
// **** SECOND READ USING response.GetResponseStream() ****
responseValue = reader.ReadToEnd();
}
}
return responseValue;
}
}
服务器的配置文件
<?xml version="1.0"?>
<configuration>
<system.serviceModel>
<services>
<service name="WcfJsonRestService.Service1" behaviorConfiguration="Metadata">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8732/service1"/>
</baseAddresses>
</host>
<endpoint address="http://localhost:8732/service1"
binding="webHttpBinding"
contract="WcfJsonRestService.IService1"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="Metadata">
<serviceMetadata httpGetEnabled="true" policyVersion="Policy15"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior>
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>
更新2:
{"Name":"Julian", "Id":123}
public string MakeRequest(string parameters)
{
Console.WriteLine("parameters:" + parameters);
var request = (HttpWebRequest)WebRequest.Create(EndPoint);
request.Method = Method.ToString();
request.ContentLength = 0;
request.ContentType = ContentType;
Console.WriteLine("request: " + request.Headers.ToString());
if (PostData != null && Method == HttpVerb.POST)
{
var encoding = new UTF8Encoding();
var bytes = ObjectToByteArray(PostData);
request.ContentLength = bytes.Length;
Console.WriteLine("Content length: " + request.ContentLength);
using (var writeStream = request.GetRequestStream())
{
writeStream.Write(bytes, 0, bytes.Length);
}
}
try
{
using (var response = (HttpWebResponse)request.GetResponse())
{
var responseValue = string.Empty;
if (response.StatusCode != HttpStatusCode.OK)
{
var message = String.Format("Request failed. Received HTTP {0}", response.StatusCode);
throw new ApplicationException(message);
}
// grab the response
using (var responseStream = response.GetResponseStream())
{
if (responseStream != null)
using (var reader = new StreamReader(responseStream))
{
responseValue = reader.ReadToEnd();
}
}
return responseValue;
}
}
catch (WebException exception)
{
string responseText;
using (var reader = new StreamReader(exception.Response.GetResponseStream()))
{
responseText = reader.ReadToEnd();
return responseText;
}
}
private byte[] ObjectToByteArray(object obj)
{
if (obj == null)
return null;
BinaryFormatter bf = new BinaryFormatter();
using (MemoryStream ms = new MemoryStream())
{
bf.Serialize(ms, obj);
return ms.ToArray();
}
}
[WebInvoke(Method = "POST",
ResponseFormat = WebMessageFormat.Json,
RequestFormat =WebMessageFormat.Json,
UriTemplate = "/postdata")]
public Person PostData(Person data)
{
//Return new person with data inputted from json message
return new Person()
{
Id = data.Id,
Name = data.Name
};
}
var request = (HttpWebRequest)WebRequest.Create(EndPoint);
request.Method = Method.ToString();
request.ContentLength = 0;
request.ContentType = ContentType;
Console.WriteLine("request: " + request.Headers.ToString());
if (PostData != null && Method == HttpVerb.POST)
{
Console.WriteLine("json length: " + json.Length);
Console.WriteLine(json);
request.ContentLength = json.Length;
var encoding = new UTF8Encoding();
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
streamWriter.Write(json);
streamWriter.Flush();
streamWriter.Close();
}
}
try
{
// **** FIRST READ USING request.GetResponse() ****
//var httpResponse = (HttpWebResponse)request.GetResponse();
//using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
//{
// streamReader.ReadToEnd();
//}
using (var response = (HttpWebResponse)request.GetResponse())
{
var responseValue = string.Empty;
if (response.StatusCode != HttpStatusCode.OK)
{
var message = String.Format("Request failed. Received HTTP {0}", response.StatusCode);
throw new ApplicationException(message);
}
// grabs the response
using (var responseStream = response.GetResponseStream())
{
if (responseStream != null)
using (var reader = new StreamReader(responseStream))
{
// **** SECOND READ USING response.GetResponseStream() ****
responseValue = reader.ReadToEnd();
}
}
return responseValue;
}
}
streamWriter.Flush()调用中的协议冲突错误是因为我没有设置request.ContentLenth。我现在已将Content.Length设置为json.Length,现在出现以下错误:
图像有点小,但错误消息如下:
"System.ArgumentException: Stream was not readable."
当你把一条流读到底时,你必须从头开始寻找它 您可以尝试以下方法:
StreamReader sr = new StreamReader(stream);
sr.ReadToEnd();
stream.Seek(0, SeekOrigin.Begin);
sr.ReadToEnd(); // This should work now
我想问题出在try块的第一行。我试图从请求对象读取响应。。。嗯。。。虽然我试着从更远的响应对象中读取响应,但是已经造成了损坏。我已经包括了下面的工作代码以及导致问题的注释掉的代码。我已经用****标记了有问题的请求。GetResponse()以及正确的响应。GetResponseStream()现在可以自由执行它的工作了,您会很高兴听到的 希望这能节省很多时间 MakeRequest方法的所有相关部分:
{"Name":"Julian", "Id":123}
public string MakeRequest(string parameters)
{
Console.WriteLine("parameters:" + parameters);
var request = (HttpWebRequest)WebRequest.Create(EndPoint);
request.Method = Method.ToString();
request.ContentLength = 0;
request.ContentType = ContentType;
Console.WriteLine("request: " + request.Headers.ToString());
if (PostData != null && Method == HttpVerb.POST)
{
var encoding = new UTF8Encoding();
var bytes = ObjectToByteArray(PostData);
request.ContentLength = bytes.Length;
Console.WriteLine("Content length: " + request.ContentLength);
using (var writeStream = request.GetRequestStream())
{
writeStream.Write(bytes, 0, bytes.Length);
}
}
try
{
using (var response = (HttpWebResponse)request.GetResponse())
{
var responseValue = string.Empty;
if (response.StatusCode != HttpStatusCode.OK)
{
var message = String.Format("Request failed. Received HTTP {0}", response.StatusCode);
throw new ApplicationException(message);
}
// grab the response
using (var responseStream = response.GetResponseStream())
{
if (responseStream != null)
using (var reader = new StreamReader(responseStream))
{
responseValue = reader.ReadToEnd();
}
}
return responseValue;
}
}
catch (WebException exception)
{
string responseText;
using (var reader = new StreamReader(exception.Response.GetResponseStream()))
{
responseText = reader.ReadToEnd();
return responseText;
}
}
private byte[] ObjectToByteArray(object obj)
{
if (obj == null)
return null;
BinaryFormatter bf = new BinaryFormatter();
using (MemoryStream ms = new MemoryStream())
{
bf.Serialize(ms, obj);
return ms.ToArray();
}
}
[WebInvoke(Method = "POST",
ResponseFormat = WebMessageFormat.Json,
RequestFormat =WebMessageFormat.Json,
UriTemplate = "/postdata")]
public Person PostData(Person data)
{
//Return new person with data inputted from json message
return new Person()
{
Id = data.Id,
Name = data.Name
};
}
var request = (HttpWebRequest)WebRequest.Create(EndPoint);
request.Method = Method.ToString();
request.ContentLength = 0;
request.ContentType = ContentType;
Console.WriteLine("request: " + request.Headers.ToString());
if (PostData != null && Method == HttpVerb.POST)
{
Console.WriteLine("json length: " + json.Length);
Console.WriteLine(json);
request.ContentLength = json.Length;
var encoding = new UTF8Encoding();
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
streamWriter.Write(json);
streamWriter.Flush();
streamWriter.Close();
}
}
try
{
// **** FIRST READ USING request.GetResponse() ****
//var httpResponse = (HttpWebResponse)request.GetResponse();
//using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
//{
// streamReader.ReadToEnd();
//}
using (var response = (HttpWebResponse)request.GetResponse())
{
var responseValue = string.Empty;
if (response.StatusCode != HttpStatusCode.OK)
{
var message = String.Format("Request failed. Received HTTP {0}", response.StatusCode);
throw new ApplicationException(message);
}
// grabs the response
using (var responseStream = response.GetResponseStream())
{
if (responseStream != null)
using (var reader = new StreamReader(responseStream))
{
// **** SECOND READ USING response.GetResponseStream() ****
responseValue = reader.ReadToEnd();
}
}
return responseValue;
}
}
没有解决问题-遇到异常,流不支持查找操作?不过我现在有了解决办法!