Возврат необработанного XML из службы WCF - PullRequest
2 голосов
/ 04 июня 2011

Я пытаюсь заставить мой веб-сервис отвечать определенной формой XML, что, я думаю, можно сделать, просто поместив данные в строку и вернув их на веб-страницу.

Я пытаюсьreturn:

<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>

1 Ответ

4 голосов
/ 04 июня 2011

Формат возврата по умолчанию - XML, поэтому, когда ваша операция возвращает строку, она будет отформатирована как XML - со строковым содержимым внутри элемента.Самый простой способ вернуть что-нибудь - это использовать необработанную модель программирования .Ваша операция будет выглядеть примерно так:

<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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...