使用.NET,VS 2010创建RESTful Web服务的最简单方法

时间:2013-02-01 20:32:22

标签: xml visual-studio-2010 web-services rest hl7

这个问题比标题所示的更具体。 我已经尝试了几种方法,希望将请求XML反序列化为一个对象,只有问题。继续阅读,请为我提出一些建议供我调查。

问题:

我很难接受HL7格式的POST。这大约是一个55k的帖子,其中包含大约200字节的有用信息。我只需要提取那几个字节。通常,这只会是大约30个字节,具体取决于向我发送了多少跟踪号码。不,我在改变这个方面没有任何发言权。

这个HL7数据采用标准XML格式,但许多属性用于传输数据,而不是元素。再一次,我似乎被发送者这样做了。 (我的偏好和Web服务经验是标准的MS Soap / WSDL设置。)

我已经使用XSD.exe创建了一个包含反序列化数据的类(来自将发送给我的一些示例XML)。但是,XSD似乎将所有属性转换为元素。当我查看生成的WCF服务页面时,我看不到看起来像我收到的xml。这种差异似乎阻止了HL7请求的反序列化?请参阅以下缩写示例:
缩写入站请求的样本(因为处理55k样本正在杀死我的大脑),只是前几行:

<?xml version="1.0" encoding="utf-8"?>
<QUQI_IN300102XXX xmlns="urn:hl7-org:v3" ITSVersion="XML_1.0">
  <realmCode code="XXX" />
  <id extension="XX011111" />
  <creationTime value="20121220133424-0500" />
  <responseModeCode code="IMMEDIATE" />
  <versionCode code="V3-2010-12" />
  <interactionId extension="QUQI_IN300102XXX" />
  <processingCode code="P" />
  <processingModeCode code="T" />
  <acceptAckCode code="NE" />
  <receiver typeCode="RCV">
    <realmCode code="XXX" />
    <device>
      <realmCode code="XXX" />
      <id extension="XXXIB" assigningAuthorityName="Service" />
    </device>
  </receiver>
  <sender typeCode="SND">
    <realmCode code="XXX" />
    <device>
      <realmCode code="XXX" />
      <id assigningAuthorityName="CCC" />
    </device>
  </sender>
  <controlActEvent>
    <realmCode code="XXX" />
    <id extension="Tracking" assigningAuthorityName="TRANSTYPE" />
    <code code="Order" />
    <statusCode />
    <queryByParameter>
      <realmCode code="XXX" />
      <queryId extension="NJ011111A-20121220133343" />
      <parameterList>
        <realmCode code="XXX" />
        <accessionNum>
          <value extension="NJ011111A" />
        </accessionNum>
        <batchNumber>
          <value extension="120927001" assigningAuthorityName="ZZ1" />
          <value extension="120927002" assigningAuthorityName="ZZ1" />
        </batchNumber>



“batchNumber”是我需要从入站请求获取的主要数据。
如果我查看“WCF项目”服务帮助页面(使用WCF REST项目类型nuget包创建,如果我没记错的话),我得到:

<QUQI_IN300102QD>
  <realmCode>
<realmCode>
  <code>String content</code>
</realmCode>
<realmCode>
  <code>String content</code>
</realmCode>
  </realmCode>
  <id>
<id>
  <extension>String content</extension>
  <assigningAuthorityName>String content</assigningAuthorityName>
</id>
<id>
  <extension>String content</extension>
  <assigningAuthorityName>String content</assigningAuthorityName>
</id>
  </id>
  <creationTime>
    <QUQI_IN300102QDCreationTime>
  <value>String content</value>
   </QUQI_IN300102QDCreationTime>
  <QUQI_IN300102QDCreationTime>
    <value>String content</value>
   </QUQI_IN300102QDCreationTime>
  </creationTime>



现在,我输入XSD.exe的XML看起来不像服务页面的内容,无论出于何种原因,当我传递post请求时,它都不会反序列化。

我希望有足够的信息来描述我的问题。

什么是解决方案的最佳选择?
创建一个MVC项目并接受XMLDoc作为post数据类型,并进行XML操作以获得我需要的东西?还是其他一些选择?
仅供参考,返回数据必须在某些时候插入XML中,但我还没有那么远。

仅供参考,我在创建Web服务方面的经验仅限于VS.你知道,文件,新项目,Web服务。然后将代理添加到使用项目中的WSDL页面并仅使用该事物。当然,第三个项目只包含其他两个项目引用的类对象,以及一些数据访问项目。

使用Fiddler编写我的请求,并打开了WCF跟踪。
我从跟踪中得到的是:

无法反序列化XML主体与根名称 '二进制' 和根名称空间 ''(操作 'methodTrackQLSBatch' 和合同( 'ShipmentTracking', 'http://tempuri.org/')),使用XmlSerializer的。确保将与XML对应的类型添加到服务的已知类型集合中。

它知道类型。如果我改变一切以使用一个非常简单的XML,它会完美地反序列化。

提前感谢您的任何想法。

我想简洁地说,我怎么能接受这个大的HL7请求,从中提取数据,将结果插入其中,然后返回它? (我可以想出“返回它”部分,嘿。虽然你永远不知道。)

1 个答案:

答案 0 :(得分:1)

听起来你在这种情况下反序列化XML不会有太大的影响。如果您只对少量数据感兴趣,最后您只想修改XML并将其返回,只需使用Linq to XML读取和操作XML即可。 (例如XDocumentXElement等)