【问题标题】:POSTing JSON data to WCF REST将 JSON 数据发布到 WCF REST
【发布时间】:2011-02-27 00:01:51
【问题描述】:

我正在尝试使用 jQuery 将数据从客户端应用程序发送到基于 WCF REST 入门工具包的 REST WCF 服务。

这是我目前所拥有的。

服务定义:

[WebHelp(Comment = "Save PropertyValues to the database")]        
[WebInvoke(Method = "POST", UriTemplate = "PropertyValues_Save",
           BodyStyle = WebMessageBodyStyle.WrappedRequest,
           RequestFormat = WebMessageFormat.Json,
           ResponseFormat = WebMessageFormat.Json)]
[OperationContract]
public bool PropertyValues_Save(Guid assetId,
                                Dictionary<Guid, string> newValues) {
            // ...
}

来自客户端的调用:

$.ajax({
     url:SVC_PROPERTYVALUES_SAVE,
     type: "POST",
     contentType: "application/json; charset=utf-8",
     data: jsonData,
     dataType: "json",
    error: function(XMLHttpRequest, textStatus, errorThrown) {
     alert(textStatus + ' ' + errorThrown);
      },
     success: function(data) {
      if (data)  {
       alert('Values saved'); $("#confirmSubmit").dialog('close'); 
      }
      else {
       alert('Values failed to save'); $("#confirmSubmit").dialog('close');
      }      
     }
    });

传递的 JSON 示例:

{
    "assetId": "d70714c3-e403-4cc5-b8a9-9713d05b2ee0",
    "newValues": [
        {
            "key": "bd01aa88-b48d-47c7-8d3f-eadf47a46680",
            "value": "0e9fdf34-2d12-4639-8d70-19b88e753ab1" 
        },
        {
            "key": "06e8eda2-a004-450e-90ab-64df357013cf",
            "value": "1d490aec-f40e-47d5-865c-07fe9624f955" 
        } 
    ] 
}

web.config

<?xml version="1.0"?>
<configuration>

     <configSections>

          <sectionGroup name="applicationSettings"
                        type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">

          </sectionGroup>

     </configSections>

 <system.web>
  <compilation debug="true"/>
        </system.web>
 <system.serviceModel>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
 </system.serviceModel>

     <appSettings>

         ...

     </appSettings>

</configuration>

我在虚拟目录上使用 Windows 身份验证,匿名访问被禁用。当我调用 GET 操作时,一切都很好。此代码提示浏览器登录。当我输入我的凭据时,我只是在浏览器中收到一条警报,上面写着“错误未定义”。

即使您无法解决我的具体错误,您是否看到任何看起来不对劲的地方?

我几乎整天都在为此苦恼。

提前致谢。

【问题讨论】:

    标签: wcf json dictionary


    【解决方案1】:

    如果您遇到身份验证问题,请务必确认只有“Windows 身份验证”已打开,并且“匿名”访问权限已在您的虚拟目录中切换。

    如果您对 irtual 目录没有任何问题,您应该发布您的 web.config 文件的代码。

    根据您的问题,我不清楚您是否只有身份验证问题,或者PropertyValues_Save 不会被您发布的 JSON 数据调用。你能把这个表述得更清楚吗?

    更新:在我看来,如果 JavaScript 客户端使用“Key”和“Value”属性名称而不是“key”和“value”,那么您的程序将正常工作。

    我建议您也查看我的旧答案 How do I build a JSON object to send to an AJAX WebService? 的末尾以验证您是否为服务器调用打包了正确的数据。

    【讨论】:

    • 身份验证已集成,是的,匿名已禁用。我只收到此特定方法的登录提示。您要求的 web.config: ...
    • 没错。我希望你在&lt;system.web&gt; 块内也有&lt;authentication mode="Windows"/&gt;,如果没有,你应该添加这个。 PropertyValues_Save 可以正常工作吗? (仅身份验证问题)
    • 格式化程序在尝试反序列化消息时抛出异常:尝试反序列化参数tempuri.org/:newValues 时出错。 InnerException 消息是“数据合同类型 'System.Runtime.Serialization.KeyValue'2[[System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version =2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]]' 无法反序列化,因为找不到所需的数据成员'Key,Value'。'。有关详细信息,请参阅 InnerException。
    • 我以前也看到过这个错误。我将身份验证模式添加到 web.config 并得到了这个异常。我在想也许我的 JSON 不好,但它通过了验证:jsonlint.com
    • 如果在我看来,JSON 没问题,但要反序列化 Dictionary,您应该使用 CollectionDataContract 属性(请参阅 msdn.microsoft.com/en-us/library/ms731923.aspxmsdn.microsoft.com/en-us/library/aa347850.aspxnetframeworkdev.com/windows-communication-foundation/…)。另一种通用的方法是让你所有的接口方法只使用非常简单的数据类型。例如,您可以使用两个List&lt;&gt; 而不是Dictionary&lt;&gt; 并在PropertyValues_Save 内部组合一个Dictionary
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多