【问题标题】:POST to Json webervice is returning Error 500POST 到 Json webervice 返回错误 500
【发布时间】:2012-11-22 00:31:55
【问题描述】:

我有标准的 asmx 网络服务返回 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 服务就像一个魅力:(

【问题讨论】:

  • 错误 500 有时是由您的 .asmx 方法中的错误引起的。还要检查使用的身份验证。
  • 只是好奇,但您为什么要手动将其序列化为 JSON 并直接写入响应?如果它是 ASMX 服务,您应该能够将其添加到方法中并从返回值中获取 JSON 响应:[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
  • 我尝试使用 [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 但它返回了 XML。直到后来我才读到它只适用于 AJAX 或 jQuery,但我打算从非 .net 移动设备调用它。

标签: c# json web-services post


【解决方案1】:

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

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

服务器应该发回说明正在发生的事情的文本。检查响应正文以获取更多信息。它也可能有本地日志记录。

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

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

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

【讨论】:

    【解决方案2】:

    试试这个,

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

    【讨论】:

      【解决方案3】:

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

      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();
      

      谢谢大家

      【讨论】:

        【解决方案4】:

        Web 服务需要使用 POST 请求明确指定的表单操作值。因此,请尝试将表单“操作”网址添加到您的 POST 请求中。

        【讨论】:

          猜你喜欢
          • 2019-02-20
          • 1970-01-01
          • 2011-08-21
          • 1970-01-01
          • 2021-04-24
          • 2018-10-04
          • 2019-08-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多