2011-06-03 104 views
2

我想让我的web服务用特定形式的XML进行回复,我认为只需将数据放入字符串并将其返回到网页即可。从WCF服务返回原始XML

我试图返回:

<tradeHistory><trade TradeId="1933" ExtId="1933" instrument="EUA" quantity="1500" setType="Escrow" TradeDate="12/02/2010" DeliveryDt="13/02/2010" PaymentDt="12/02/2010" type="BUY" pricePerUnit="6.81" GrossConsid="10320" currency="EUR"/></tradeHistory> 

但是,当我返回字符串我越来越:

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">&lt;tradeHistory&gt;&lt;trade tradeid="1933" ExtId="1933" Instrument="EUA" quantity"1500" setType="Escrow" TradeDate="24/05/2011" DeliveryDt="25/05/2011" PaymentDt="25/05/2011" type"BUY" pricePerUnit="6.81" GrossConsid="10320" currency="EUR" /&gt;&lt;tradeHistory&gt</string> 

我如何能实现这一目标的任何想法?这将是很好不会有标签,但我可以忍受,但我有问题是它不是格式化字符串正确的阅读开始和结束标记为特殊字符

我的服务是:

<ServiceContract(Namespace:="")> 
Public Interface ITradePortal 

<WebGet(UriTemplate:="Reporting/GetClientTrades/{ClientID}")> 
    <OperationContract()> 
    Function GetClientTrades(ByVal ClientID As String) As String 
End Interface 

我的实现是:

<ServiceBehavior(ConcurrencyMode:=System.ServiceModel.ConcurrencyMode.Multiple, InstanceContextMode:=InstanceContextMode.Single, _ 
Namespace:="")> 
<XmlSerializerFormat()> 

和我的配置文件:

<services> 
      <service behaviorConfiguration="Default" name="CFP_Web_Lib.TradePortal"> 
       <host> 
       <baseAddresses> 
        <add baseAddress="http://localhost:8686/TradePortal"/> 
       </baseAddresses> 
       </host> 
       <endpoint address="" binding="webHttpBinding" 
        contract="CFP_Web_Lib.ITradePortal" 
          behaviorConfiguration="web" 
        /> 
       <endpoint address="Operations/" binding="wsDualHttpBinding" 
        contract="CFP_Web_Lib.ITradeOperations"/> 
        </service> 
     </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="Default"> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="web"> 
      <webHttp/> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <bindings> 
     <wsDualHttpBinding> 
     <binding name="WSDualHttpBinding_IPubSubService" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" 
      textEncoding="utf-8" useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
      maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" /> 
      <security mode="Message"> 
      <message clientCredentialType="Windows" negotiateServiceCredential="true" 
       algorithmSuite="Default" /> 
      </security> 
     </binding> 
     </wsDualHttpBinding> 
     <mexHttpBinding> 
     <binding name="NewBinding0" /> 
     </mexHttpBinding> 
    </bindings> 
+0

你可以尝试改变返回一个XmlElement而不是字符串的方法吗?不知道我是否有这个WCF,虽然... – 2011-06-03 21:00:28

+0

以上的建议是一个很好的,不管它是否足以解决整个问题:如果你要返回XML,然后返回XML,而不是一个字符串。 – 2011-06-03 21:19:37

回答

3

默认返回格式是XML,所以当您的操作返回String时,它将被格式化为XML - 字符串内容在元素中。最简单的方法返回什么将使用raw programming model。你的行动将是这个样子:

<WebGet(UriTemplate:="Reporting/GetClientTrades/{ClientID}")> _ 
<OperationContract()> _ 
Function GetClientTrades(ByVal ClientID As String) As Stream 

和实现:

Function GetClientTraces(ByVal ClientID As String) As Stream Implements ITradePortal.GetClientTraces 
    Dim result as String = "<tradeHistory>...</tradeHistory>" 
    WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml" ' or anything you need 
    return new MemoryStream(Encoding.UTF8.GetBytes(result)) 
End Function 

另一种选择,如果你不想来处理数据流,是返回类型更改为XmlElement的(或的XElement)。这是写“按原样”,所以你可以返回任意的XML。

另一种选择是创建类来保存该数据。 TradeHistory类将持有对“Trade”实例的引用,Trade类将具有许多使用该属性声明的字段。该操作然后将具有返回类型TradeHistory

+0

您必须从使用DataContractSerializer切换到XmlSerializer以便将'Trade'对象上的字段作为属性而不是子元素进行序列化。但是这样做也会使得服务更加令人愉快,可以从可以再次反序列化的客户端使用,而不必处理原始XML字符串。 – shambulator 2011-06-03 21:14:58

+0

这两个例子都很完美。好答案! – evilfish 2013-06-20 12:49:40