如何创建 JSON 以匹配/序列化到 WCF Rest 服务中的 DataContract

2023-12-12

界面:

namespace SQRT_WCF
    {
    [DataContract]
    public class PlaceOrder
    {
        [DataMember]
        public string claimID { get; set; }
        [DataMember]
        public string rederenceDate { get; set; }
    }
}

调用的 C# 方法:

public SQ_jsonModel.Response placeOrder(PlaceOrder argPlaceOrderJSON)
{
   ...
}

我已将 Web 服务附加到工作进程,并通过代码进行跟踪。到目前为止,我尝试过的所有操作,变量 argPlaceOrderJSON 均为 null。

我尝试过至少三种变体:

变化#1

{
         "claimID" : "value",
         "rederenceDate" : "value"
}

变化#2:

{
    "PlaceOrder" : {
         "claimID" : "value",
         "rederenceDate" : "value"
}

变化#3:

{
    "ns0:PlaceOrder" : {
        "@xmlns:ns0" : "SQRT_WCF",
         "claimID" : "value",
        "rederenceDate" : "value"
}

我编写了一个快速的 C# 控制台程序来构建和序列化一个对象,它与上面的变体 1 匹配。所以现在我认为问题不在于 JSON,而在于 SOAP-UI 和 Web 服务之间的握手。接下来我将编写一个 C# 测试客户端,看看会发生什么。

SQRT_WCF.PlaceOrder order = new SQRT_WCF.PlaceOrder();
order.ClaimID = "claim1"; 
string strJson = new JavaScriptSerializer().Serialize(order);

有人询问 webservice 中的属性,假设这就是他的意思:

公共接口 ISQRTREST { 【运营合同】 无效 DoWork();

    [OperationContract]
    [WebInvoke(Method="GET",
        ResponseFormat = WebMessageFormat.Json ,
        BodyStyle = WebMessageBodyStyle.Wrapped ,
        UriTemplate ="json/{id}"
        )]
    string JSONData(String id);


    [OperationContract]
    [WebInvoke(Method = "POST",
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Wrapped,
        UriTemplate = "placeOrder/"
        )]
    SQ_jsonModel.Response placeOrder(PlaceOrder order);

}

网页配置

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

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="SQRT_WCF.SQRTREST" behaviorConfiguration="ServiceBehaviour">
        <endpoint address="" binding="webHttpBinding" bindingConfiguration="longTimeoutBinding" contract="SQRT_WCF.ISQRTREST" behaviorConfiguration="web">
        </endpoint>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehaviour">
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="web">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <bindings>
      <webHttpBinding>
        <binding name="longTimeoutBinding"
        receiveTimeout="00:10:00" sendTimeout="00:10:00">
          <security mode="None"/>
        </binding>
      </webHttpBinding>
    </bindings>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

</configuration>

更新: 似乎更改 BodyStyle = WebMessageBodyStyle.Bare 使其可以与变体 1 一起使用。

但现在的问题是我需要能够让它与 WebMessageBodyStyle.Wrapped 一起工作。

这是生产中的现有 Web 服务。编写该程序的人早已去世,现在 B2B/BizTalk 团队正在接管该项目。我们正在使用尚未具备 REST 的 BT2010,并且我们正在尝试为客户提供相同的界面,因此他们无需更改 URL 以外的任何内容。

RESTful Web 服务主体格式似乎解释得相当好,我即将尝试使用 C# 中的 .wrapped 选项的变体 2。

更新2: 尝试使用 BodyWrapped 的变体 2 仍然得到一个 null 对象:

我就是这样包裹的。采取了 Update1 中有效的方法

string strPostBodyWrapped = "{\"PlaceOrder\" : " + strPostBody + "}";

午餐后将进行更多调试。

更新3: 还是没有运气。根据上面的 StackOverflow 参考,看起来包装器应该是“实体”,我尝试了几种方法:

来自 SOAP-UI:

{
    "entity" : { 
        "claimID" : "value",
}

我还尝试了“实体”而不是“实体”,请确定。

我的数据合同中的所有字段都是字符串,因此序列化日期或数字应该没有问题。

来自 C# 客户端测试程序:

            strPostBody = replaceSingleWithDoubleQuotes("{'ClaimID':'testvalue'}"); 

            string strPostBodyWrapped = replaceSingleWithDoubleQuotes("{'entity': ") + strPostBody + "}";

public static string replaceSingleWithDoubleQuotes(string argText)
    {
        return argText.Replace("'", "\"");
    }

如果我在 SOAP_UI 中尝试一些不好的事情,就像这样:

{
    "entity" : {  xxx 
        "claimID" : "value",
}

然后我意识到实体不是关键字而是他的类的名称......哎呀。 所以我尝试了“Placeorder”和“placeorder”作为我的案例的包装。

我收到一个很好的错误,如下所示:

The server encountered an error processing the request. The exception message is 'The formatter threw an exception while trying to deserialize the message: Error in deserializing body of request message for operation 'placeOrderSQRT'. Encountered unexpected character 'x'.'...

所以我不明白为什么在这种情况下解析器会失败,但在其他情况下它不会失败,但它也不会设置任何字段值。

如果我尝试无效的字段名称,但语法正确,解析器似乎不会给出任何错误,例如“claimIDxxxxxxxx”:“值”


答案就埋在这里:

WCF BodyStyle WrappedRequest 不适用于传入的 JSON 参数?

包装器的名称不是参数类型,而是参数名称。

所以在我的例子中,包装器名称是“order”,因为我的参数名称是“order”:

SQ_jsonModel.Response placeOrderSQRT(PlaceOrder order);

现在 SOAP-UI 的工作原理如下:

{
    "order" : {
         "claimID" : "value",
         "rederenceDate" : "value"
}

对我来说,这是非常令人震惊的;通常我们可以更改变量名称和参数名称(只是不是类名称),而对用户界面绝对没有影响。参考文章展示了如何使用属性“MessageParameter”来设置外部名称,并且仍然允许在需要时更改内部名称。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何创建 JSON 以匹配/序列化到 WCF Rest 服务中的 DataContract 的相关文章

随机推荐

  • 由于对象被密封或冻结,因此无法为颜色属性设置动画

    我见过其他类似的问题 但他们似乎总是在 XAML 中这样做 因为这是在事件处理程序中 我需要在 C 中找出答案 基本上我只需要发送菜单项闪烁红色 ColorAnimation ca new ColorAnimation From Color
  • 通过 Interop 为 Microsoft Access 创建宏

    是否可以使用 Microsoft Access 中的 Interop 库以与 Word Excel 或 PowerPoint 类似的方式使用 C 创建新宏 在其他应用程序中 您可以访问Microsoft Vbe Interop VBComp
  • 使用 Powershell 更新 Azure 网站实例大小(小、中、大)

    有没有办法扩展 Azure 网站实例大小 不是实例计数 使用 PowerShell 我还没有找到路 我知道可以使用 Azure CLI 或门户来完成此操作 但我希望能够使用 PowerShell 来完成此操作 这可能吗 我想要update现
  • 视频处理帧间预测[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我需要在 Matlab 中对一组 30 帧进行视频处理的 帧间预测 和 运动补偿 我正在处理母女框架 到目前为止我所做的是获取第一帧并将其分为 8x8 块 进行 DCT 量化它
  • 该表违反了哪种范式?

    考虑这个表 name hobby1 hobby2 hobby3 kris ball swim dance james eat sing sleep amy swim eat watch 兴趣爱好的类型没有优先顺序 因此所有兴趣爱好都属于同一
  • 定期画线

    我现在的情况是 我想在一段时间内一条一条地画线 我尝试使用线程来做到这一点 但它对我不起作用 目标是我有 5 行 这些线应该一根接一根地绘制 延迟 5 秒 在 onDraw 方法中使用 Thread sleep 5000 但所有线都是在 5
  • 使用 HTML 表单验证仅验证可见字段?

    我有两组表单字段 每组中都有一些具有必填属性的字段 但是 根据用户选择的内容 一组可能会被隐藏 并且这些字段不应包含在 HTML 表单验证中 到目前为止 如果我的表单中只有一个可见容器并且我填充了所有必填字段 我的表单将不会提交 由于某种原
  • Apache POI:如何添加对角边框

    我想用Apache POI画画Diagonal Border但我找不到任何函数可以支持该功能 我试过这个设置边框对角线但它不起作用 XSSFSheetConditionalFormatting my cond format layer my
  • Cakephp:插入tinyint字段时。仅获取“0”或“1”

    我是 cakephp 的菜鸟 从事开源项目 问题是 当我为某个表插入一个值 is adjusted tinyint 时 我的 php 代码成功执行 但该表仅采用 0 或 1 作为其值 示例代码 reward ta customer rewa
  • 使用 iPhone 进行移动设备管理

    任何人都可以给我提供一些有关 iOS4 的 iphone 设备管理的信息吗 1 如何实现它以及它将如何工作 2 它是否可以仅与企业许可证持有者一起使用 或者我们可以简单地实施开发人员许可证 3 任何具体文档或帮助 Thanks 1 如何实现
  • Swift:将图像添加到 CAShapeLayer

    我有一个带有填充颜色的 CAShapeLayer 并且想要在此形状的中心添加一个图标 var shape CAShapeLayer shape fillColor UIColor white 0 90 alpha 1 CGColor var
  • 如何将按位运算应用于 JS 数字的实际 IEEE 754 表示?

    在 JavaScript 中 每当您执行按位运算时 例如x lt lt 2 在实际发生移位之前 64 位浮点表示形式会转换为 32 位无符号整数 我有兴趣将这种转换应用于实际的 未改变的 IEEE 754 位表示 这怎么可能 您可以尝试先将
  • 生成 ASCII 艺术文本的 PHP 库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在尝试制作一个与使用 ASCII 艺术文本的其他系统不同的验证码系统 类似可以查到的here 有谁知道可以生成类似内容的库 您链接使用的 ASC
  • Codeigniter - 在特定视图上加载特定的 JS 库

    我正在尝试加载谷歌地图 API 即
  • 如何在 django 模板中执行查询过滤

    我需要从 django 模板中执行过滤查询 以获取与视图中的 python 代码等效的一组对象 queryset Modelclass objects filter somekey foo 在我的模板中我想做 for object in d
  • 无法解析绑定。敲除错误

    这是我学习淘汰赛的第二天 尝试附加 deleteItem 以进行按钮单击 它给出以下错误 Error 未捕获的错误 无法解析绑定 消息 ReferenceError deleteItem 未定义 绑定值 点击 deleteItem Java
  • 无法从本地 App Engine 开发服务器访问 BigQuery

    这具体是一个与 python Google App Engine 应用程序和 Google BigQuery 之间的服务器到服务器身份验证相关的问题 但可能与其他云服务相关 太棒了 是否可以让 App Engine 本地开发服务器通过远程
  • 如何使用 GatsbyJS 根据路由渲染组件?

    我在用着GatsbyJS我正在尝试渲染一个不同的header根据URL的路由 例子 mydomain com gt 应该渲染HeaderLanding mydomain com blog gt 应该渲染HeaderMain 有谁知道创建条件
  • 尝试后 sys.exit 无法按预期工作:

    我尝试了以下脚本 我的本意是如果下面代码段中的命令 command a 执行成功 则程序结束 否则 它会执行附加处理 usr bin python import subprocess try command command a subpro
  • 如何创建 JSON 以匹配/序列化到 WCF Rest 服务中的 DataContract

    界面 namespace SQRT WCF DataContract public class PlaceOrder DataMember public string claimID get set DataMember public st