C# Web服务拒绝接收JSON中的参数和回复

C# Web服务拒绝接收JSON中的参数和回复,c#,asp.net,web-services,asmx,C#,Asp.net,Web Services,Asmx,我试图从c#应用程序调用json格式的web服务(.asmx) 当我将请求方法指定为GET,而不指定contentType时 (请求为HttpWebRequest) 一切正常,但我得到了XML响应。 指定内容类型时: req.ContentType = "application/json; charset=utf-8"; 我明白了 500内部服务器错误 当我更改请求方法时: req.Method = "POST"; 我只能调用无参数方法,该方法返回正确的json,但如果我尝试使用参数

我试图从c#应用程序调用json格式的web服务(.asmx)

当我将请求方法指定为GET,而不指定contentType时

(请求为HttpWebRequest)

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

req.ContentType = "application/json; charset=utf-8";  
我明白了

500内部服务器错误

当我更改请求方法时:

req.Method = "POST";  
我只能调用无参数方法,该方法返回正确的json,但如果我尝试使用参数调用方法,我会再次得到500个错误

web服务代码:

    [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请求(我真的倾向于相信这就是问题所在):

还尝试:

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类型推荐


非常感谢。

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

更新2:

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

Accept: application/json, text/javascript, */*
还有一些其他的区别,但这是唯一一个跃出作为一个可能的吸烟枪

更新的答案(回应更新的问题):

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

{'aString':'kjkjk'}
原始答案:

我认为您设置的“aString”内容不正确。对于POST方法请求,“有效负载”数据不应用于报头,而是请求本身的内容。因此,您需要将其流式传输到请求对象上;有关示例,请参见。不要忘记设置请求的内容长度

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

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

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

使用get和POST时的结果与以前完全相同。在Fiddler中检查了它,我得到了一个json响应:{“消息”:“处理请求时出错”,StackTrace:“,”ExceptionType:“}”(标头处有500个内部服务器错误)此外,如果我尝试省略contentType,我会得到一个XML响应。您是否仍在设置contentType标头?如果是,您是否发送JSON?如果不是,请删除该标头,因为服务可能无法尝试解析输入。嗯,如果省略contentType,并设置accept,仍然会生成XML,我想说的是,该服务的核心存在问题e webservice,但由于我不知道ASP.NET,我无法告诉您不幸的是什么或在哪里。您可以在其中包含配置传出请求的代码吗?特别是,如何添加“aString”参数?这可能有助于调试问题。此外,ASMX类本身是否标记为:[ScriptService]?我想(不是100%确定)这是使用POST模式请求和JSON格式数据访问Web服务所必需的。@Mikemane:非常感谢您的输入。已更新。仍然不走运..需要更具体的回答一件蠢事:确保您的URL(methodUrl)指向正确的Web服务(htp://yourmachine/MyAPI.asmx/Echo). (故意拼错了“http”以便在评论中正确显示)我应该为自己感到羞愧(:。现在还不能给你奖金,只需要22小时(按规定)。谢谢。URL是个问题?这发生在我认识的每个开发人员身上(包括我自己)-你太关注细节和可能的更深层次的原因,以至于需要一双新的眼睛来指出明显的问题。:(:不,json是个问题,我非常确信ASP.NET会为我解决这个问题,我忽略了它。
{'aString':'kjkjk'}
{'aString':'This is the text I want to echo.'}