C# 为什么我会收到HttpWebResponse的错误请求(代码400)?

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

我正在向WCF服务器应用程序发送一条简单的json消息

Json消息:

{"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;
            }
        }

没有解决问题-遇到异常,流不支持查找操作?不过我现在有了解决办法!