将参数传递给WCF服务时出现内部服务器错误

时间:2012-02-27 15:43:48

标签: jquery ajax json wcf .net-3.5

我正在搞乱我的第一个WCF服务而且我在传递参数方面遇到了问题。

我的jQuery ajax调用看起来像这样......

$.ajax({
    type    : 'POST',
    async   : true,
    url     : 'Service2.svc/GetStats',
    contentType: 'application/json; charset=utf-8',
    data    : '{ i : 12 }',
    dataType: 'json',
    success : function(result) {
        //success routine...
    }
});

添加我的服务代码就像......

<OperationContract()> _
<WebInvoke(ResponseFormat:=WebMessageFormat.Json, RequestFormat:=WebMessageFormat.Json)> _
Public Function GetStats(ByVal i As Integer) As Results
    Dim returnValue As New Results
    returnValue.iValue1 = 10
    returnValue.iValue2 = 20
    returnValue.sMessage = "You executed " + "sdfsd"
    Return returnValue
End Function

Results类是一个非常简单的持有者类,两个整数和一个字符串。

如果从GetStats中删除参数并从$ .ajax对象中删除相应的data属性,此服务正常工作 - 我可以访问客户端上的三个返回值。

如果包含参数i,我会获得Internal Server Error状态:500。

我猜我错过了我的服务功能中的属性或其他内容?

3 个答案:

答案 0 :(得分:1)

您正在尝试将数据作为字符串发送。你必须把它作为一个对象发送。

data    : { i : 12 },

UMM。它不起作用。

试试这个。

data: 'i=12';

更改您的服务,然后重试。

<OperationContract()> _
<WebInvoke(ResponseFormat:=WebMessageFormat.Json, RequestFormat:=WebMessageFormat.Json)> _
Public Function GetStats(ByVal i As String) As Results
    Dim returnValue As New Results
    returnValue.iValue1 = 10
    returnValue.iValue2 = 20
    returnValue.sMessage = "You executed " + "sdfsd"
    Return returnValue
End Function

答案 1 :(得分:1)

感谢您的回复。

我花了一些时间与这个摔跤,我需要做的就是...

        data    : '{"i" : 12}' ,  //Object name i in double-quotes

与其他一些建议相反,我想要将JSON作为字符串传递。 (我想人们应该真正使用Crockford's JSON这样的库)

然而,我只能在找到实际错误后发现这一点。我通过将此代码段放入我的web.config文件...

来完成此操作
<system.diagnostics>
  <sources>
    <source name="System.ServiceModel" switchValue="Warning, ActivityTracing"
      propagateActivity="true">
      <listeners>
        <add type="System.Diagnostics.DefaultTraceListener" name="Default">
          <filter type="" />
        </add>
        <add name="ServiceModelTraceListener">
          <filter type="" />
        </add>
      </listeners>
    </source>
  </sources>
  <sharedListeners>
    <add initializeData="app_tracelog.svclog"
      type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, 
        Culture=neutral, PublicKeyToken=b77a5c561934e089"
        name="ServiceModelTraceListener" traceOutputOptions="Timestamp">
      <filter type="" />
    </add>
  </sharedListeners>
</system.diagnostics>

我是从mkdot.net得到的,它应该真的是使用SvcConfigEditor.exe生成的 - 我在锁定的机器上找不到它。但只是粘贴它似乎工作 - 并在我的开发文件夹中给了我一个日志文件 - 这实际上告诉我错误的性质。

答案 2 :(得分:0)

你应该做

var data = { i : 12 };

$.ajax({
    type    : 'POST',
    async   : true,
    url     : 'Service2.svc/GetStats',
    contentType: 'application/json; charset=utf-8',
    data    : data,
    dataType: 'json',
    success : function(result) {
        //success routine...
    }
});

您将数据作为字符串发送,而它应该是一个对象