Возвращение простого старого XML с WCF - PullRequest
2 голосов
/ 22 октября 2011

Как это может быть так сложно и почему? Возврат простого XML без пространств имен и декарации XML. Создать XML с помощью XML Writer легко, и если я выведу его в файл, то это здорово. Как на земле вы можете вернуть содержимое через WCF. Использование XML-элемента бесполезно, поскольку вы теряете объявление XML, а использование строки не годится, поскольку выходные данные заключены в элемент . Невозможно вернуть документ XML, так как он не может быть сериализован.

Я знаю, что на этом сайте много постов, но никто не отвечает на вопрос. Я использую VB.NET (мальчик, я бы хотел, чтобы у меня было время изучить C #), и я не могу заставить работать Контракт на данные, даже используя IXmlSerializer. Пример вывода, который мне нужно отправить обратно через службу WCF:

<?xml version="1.0" encoding="utf-8"?>
 <BookingResponse timestamp="" success="1">
<confirmation id="" track_code="" status="" notes="" tracking_url="" confirmed_at=""/>
 </BookingResponse>

К сожалению, служба, которую я отправляю, не примет ничего, кроме этого простого XML. Он не будет принимать дополнительные пространства имен, которые, по-видимому, WCF вставляет самостоятельно.

Я использую шаблон онлайн-отдыха для VB, который доступен для Visual Studio 2010.

Помощь! Пожалуйста! у кого-то должен быть ответ?

Вот код:

<WebInvoke(UriTemplate:="BookJob", Method:="POST")>
        Public Function Create(ByVal XMLBooking As Stream) As Stream
            'DO SOME PROCESSING ON THE REQUEST - THIS ALL WORKS FINE.....

            Dim str As String

'This CreateResponseXML function creates a String version of the XML, which is built using XMLWriter.


       str = CreateResponseXML(True, vConfirmationID, sqlFuncs.BookingStatus("Confirmed"), "", "")

            Dim memoryStream As New MemoryStream()
            Using streamWriter As New StreamWriter(memoryStream)
                streamWriter.Write(str)
                streamWriter.Flush()

                memoryStream.Position = 0

                Return memoryStream
            End Using

        End Function

Чтобы добавить к себе, они должны использовать безопасное соединение. Я использую шаблон онлайн-отдыха для VB, доступный для Visual Studio 2010, который значительно сокращает записи в файле web.config по сравнению с обычным файлом, который я вижу везде. Это выглядит так :

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

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <customErrors mode="Off"/>
  </system.web>

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </modules>
  </system.webServer>

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>

    <bindings>
      <webHttpBinding>
        <binding transferMode="Streamed">
          <security mode="Transport" />
        </binding>
      </webHttpBinding>
    </bindings>

    <standardEndpoints>
      <webHttpEndpoint>
        <!-- 
            Configure the WCF REST service base address via the global.asax.vb file and the default endpoint 
            via the attributes on the <standardEndpoint> element below
        -->
        <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true" faultExceptionEnabled="true">
          <security mode="Transport" />
        </standardEndpoint>
      </webHttpEndpoint>
    </standardEndpoints>

  </system.serviceModel>



</configuration>

Я пытался вернуть MemoryStream, предшествующий этому коду, но полученный ответ был обернут в элемент MemoryStream и был gobbldegook (но это могло быть связано с тем, что я пропустил запись TransferMode = "Streamed" в Интернете .config. Эта версия вообще ничего не возвращает.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 22 октября 2011

Используйте Stream в качестве возвращаемого значения.

1 голос
/ 22 октября 2011

Использовать WCFRestContrib он имеет формат POX (Plain Old Xml), который чистый и без каких-либо пространств имен.

Форматер POX использует System.Runtime.Serialization.DataContractSerializer, но в отличие от WCF REST Contrib xml formatter ([Обсуждается в разделе Xml Formatter) Обзор), не сериализует пространства имен контракта данных или схему XML атрибуты, не требуется указывать пространства имен в xml для быть десериализованным и не требующим, чтобы элементы находились в порядок. Это позволяет вам обслуживать и принимать очень простой XML.

См. Обзор форматера POX

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