【问题标题】:Web service refuses to receive parameters and reply in JSONWeb 服务拒绝接收参数并以 JSON 格式回复
【发布时间】:2011-04-21 07:31:13
【问题描述】:

我正在尝试从 c# 应用程序以 json 格式调用 Web 服务 (.asmx)。

当我将请求方法指定为 GET 并且不指定 contentType 时。

(req 是 HttpWebRequest)

req.Method = "GET";

一切正常,但我得到了 XML 响应。
当我指定内容类型时:

req.ContentType = "application/json; charset=utf-8";  

我明白了

500 内部服务器错误。

当我更改请求方法时:

req.Method = "POST";  

我只能调用无参数方法,它会正确返回 json,但如果我尝试调用 带有 参数的方法,我会再次收到 500 错误。

网络服务代码:

    [WebMethod(EnableSession =true)]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string SimplestWebService()
    {         
        return "hello";
    }  

和带参数:​​

    [WebMethod(EnableSession = true)]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string Echo(string aString)
    {       
        return aString;
    }

任何想法将不胜感激。

补充:也许我没有正确地编写 POST 请求(现在我在标头中发送它,就像 GET 请求一样)。有人可以指导我吗?

模式添加:网站确实被标记为脚本:

[ScriptService]
public class MyAPI : System.Web.Services.WebService  

这是我构建 POST 请求的方式(我真的倾向于认为这是问题所在):

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(methodUrl.ToString());
req.Method = "POST";
req.Headers.Add("aString","oren");
req.ContentLength = 0;    
...
req.ContentType = "application/json; charset=utf-8";
req.Accept = "application/json; charset=utf-8";
using (HttpWebResponse res = (HttpWebResponse)req.GetResponse())
{
  StreamReader sr = new StreamReader(res.GetResponseStream());
  result.Append(sr.ReadToEnd());
}  
...

也试过了:

req.Method = "POST";          
string postData = "aString=kjkjk";
req.ContentType = @"application/json; charset=utf-8";
req.Accept = @"application/json; charset=utf-8";   
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] byte1 = encoding.GetBytes(postData);
req.ContentLength = byte1.Length;
Stream newStream = req.GetRequestStream();
newStream.Write(byte1, 0, byte1.Length);
newStream.Close();           

最后两个注意事项:
1. 此 Web 服务使用浏览器以 XML 格式运行。
2. 请求json,代码在web服务处永远不会到达断点。所以这可能是一个 IIS(我使用的是 IIS 6.1)问题。我试过 MIME 类型推荐here

非常感谢。

【问题讨论】:

  • 能否包含配置传出请求的代码?具体来说,您如何添加“aString”参数?这可能有助于调试问题。
  • 另外,ASMX 类本身是否标记为:[ScriptService]?我认为(不是 100% 肯定)使用 POST 模式请求和 JSON 格式的数据访问 Web 服务是必要的。
  • @mikemann:非常感谢您的意见。已更新。

标签: c# asp.net web-services asmx


【解决方案1】:

更新 2:

我正在使用 fiddler2 来查看一个成功的 POST 请求(从 jquery 到我的 asmx 服务),我发现了一个可能值得检查的差异:

Accept: application/json, text/javascript, */*

还有一些其他的不同,但那是唯一一个可能会冒出确凿证据的区别。

更新的答案(针对更新的问题):

看起来您正确使用了 contentStream。但是,您推送的数据(“aString=kjkjk”)不是有效的 JSON。如下所述,您的数据可能需要采用有效的 JSON 格式:

{'aString':'kjkjk'}

原答案:

我相信您错误地设置了“aString”内容。对于 POST 方法请求,“有效负载”数据不应用于标头,它是请求本身的内容。因此,您需要将其流式传输到请求对象上;有关示例,请参见 this MSDN reference。不要忘记设置请求的内容长度。

由于您通过 JSON 实现服务(并将 JSON 指定为内容类型),我相信您需要将 JSON 字符串转换为原始字节,这就是您将其推送到流中的内容.您的 JSON 字符串应如下所示:

{'aString':'This is the text I want to echo.'}

您可能需要进行一些微调(我不在一个可以轻松组合精确代码示例的地方),但这应该会让您朝着正确的方向前进。

【讨论】:

  • 仍然没有运气..需要更具体的答案
  • 一件愚蠢的事情:确保您的 URL (methodUrl) 指向正确的 Web 服务 (htp://yourmachine/MyAPI.asmx/Echo)。 (故意拼错“http”,因此它会在此评论中正确显示)
  • 应该为自己感到羞耻(-:。还不能给你赏金,只能在 22 小时内(SO 规则)。谢谢。
  • 网址有问题吗?这发生在我认识的每个开发人员(包括我自己)身上——你如此专注于细节和可能的更深层次的原因,以至于需要用全新的眼光来指出显而易见的事情。 :)
  • (-: 不,json 是问题所在,我很确定 ASP.NET 会为我解决这个问题,我忽略了它。
【解决方案2】:

ContentType 在我看来是 request 的内容类型,而不是响应。如果您改为发送 Accept 标头会发生什么情况(通知服务器您愿意接受的内容类型)。

【讨论】:

  • 使用 GET 和 POST 的结果与之前完全相同。
  • 在 Fiddler 中检查它,我得到一个 json 响应:{"Message":"处理请求时出错。","StackTrace":"","ExceptionType":" "} (以及标题中的 500 内部服务器错误)
  • 此外,如果我尝试省略 contentType,我会收到 XML 响应。
  • 您还在设置 ContentType 标头吗?如果是这样,你发送 JSON 吗?如果没有,请删除该标头,因为服务可能无法尝试解析输入。
  • 嗯,如果省略content-type,设置accept,还是会生成XML,我想说webservice的核心有问题,但是我不懂ASP.NET,不幸的是,我无法告诉你什么或在哪里。
猜你喜欢
  • 2011-02-02
  • 2023-04-04
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多