POST到Json Web服务返回错误500

时间:2012-11-22 00:31:56

标签: c# json web-services post

我有标准的asmx webservice返回Json:

private void ReturnUser(string name)
{
    User user = new User(name);
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
    MemoryStream stream = new MemoryStream();
    serializer.WriteObject(stream, @object);
    string jsonString = Encoding.UTF8.GetString(stream.ToArray());
    stream.Close();

    HttpContext.Current.Response.AddHeader("ContentType", "application/json");
    HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
    HttpContext.Current.Response.Write(jsonString);
    HttpContext.Current.Response.End();
}

另一方面,我想尝试运行webservice,所以我尝试调用POST:

string data = "name=test";
byte[] dataStream = Encoding.UTF8.GetBytes(data);

WebRequest request = WebRequest.Create("http://tempuri.org/External.asmx?op=ReturnUser");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = dataStream.Length;
Stream reqStream = request.GetRequestStream();
reqStream.Write(dataStream, 0, dataStream.Length);
reqStream.Close();
WebResponse response = (HttpWebResponse)request.GetResponse();

Stream stream = response.GetResponseStream();
StreamReader reader = new StreamReader(stream);
string json = reader.ReadToEnd();
stream.Close();
reader.Close();

Console.Write(json);
Console.Read();

但是我得到了错误500.从浏览器开始,web服务像魅力一样运行:(

4 个答案:

答案 0 :(得分:1)

在许多服务器上,500系列错误是安全或权限错误。由于您收到500错误,因此您至少可以获得与服务器的完全连接。

显然,您的代码永远不会被调用,因为它无法生成500错误 - 因此您依赖的服务器层正在执行此操作。这有点像权限或安全性。

服务器应该发送回文件来说明发生了什么。检查响应正文以获取更多信息。它也可能有帮助的本地日志记录。

我不得不用.NET代码解决类似的问题。我需要从服务器通过HTTP获取信息,但它需要身份验证。我无法使用任何集成的安全方法,如Kerberos或基本身份验证,因为我使用的服务器基于cookie(有时称为基于表单)身份验证。

如果您遇到此问题,可能会有所帮助: .NET - Consuming HTTP services on (Domino) server with form based authentication

我的服务器是Domino,但这个想法适用于任何HTTP服务器。

答案 1 :(得分:0)

试试这个,

WebRequest request = WebRequest.Create("http://tempuri.org/External.asmx");
request.Headers.Add("SOAPAction", "\"http://tempuri.org/ReturnUser\"");

答案 2 :(得分:0)

最后,我解决了这个问题,这可能对其他人有所帮助:

string data = "name=test";
byte[] dataStream = Encoding.UTF8.GetBytes(data);

WebRequest request = WebRequest.Create("http://tempuri:org/External.asmx/ReturnUser");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
Stream stream = request.GetRequestStream();
stream.Write(dataStream, 0, dataStream.Length);
stream.Close();
WebResponse response = request.GetResponse();

Stream respStream = response.GetResponseStream();
StreamReader reader = new StreamReader(respStream);
string json = reader.ReadToEnd();
stream.Close();
reader.Close();

感谢所有

答案 3 :(得分:-1)

Websevices需要使用POST请求显式指定的表单操作值。因此,请尝试在您的POST请求中添加表单“操作”网址。