2011-10-22 50 views
2

這怎麼會這麼困難,爲什麼?返回不帶名稱空間和XML十進制的簡單XML。使用XML Writer創建XML很容易完成,如果我將它輸出到一個文件那麼很好。你怎麼可以通過WCF返回內容。使用XML元素不好,因爲您丟失了XML聲明,並且使用字符串不好,因爲輸出包含在<字符串>元素中。無法返回XML文檔,因爲它無法序列化。用WCF返回普通舊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 

要添加到他們必須使用安全連接無驅。我正在使用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 =「流」在web.config條目。這個版本返回什麼都沒有。

什麼想法?

回答

1

使用WCFRestContrib有POX格式(普通舊XML)是乾淨的,沒有任何的命名空間。

痘格式化器利用 System.Runtime.Serialization.DataContractSerializer,但不同的是 WCF REST的Contrib XML格式化器([下的Xml格式化 概述中討論),不序列數據契約的命名空間或XML模式 屬性,它不需要命名空間在xml中被指定爲 就可以被反序列化,並且它不要求元素在特定的 順序中。這使您可以提供和接受非常簡單的XML。

POX Formatter Overview

1

使用流作爲返回值。

+0

感謝你的這一點,我的確想到了這一點。如果他不使用Microsoft工具,接收者是否能夠查看流內的文本? – Tim

+0

@tim絕對。你要返回的只是一串字節。不要忘記將內容類型標題設置爲適當的媒體類型。 –

+0

嗨Darrel,剛剛有一個迴應,他們無法讀取流。我使用並返回一個MemoryStream。這是我的問題,我如何將內存流轉換爲普通的流? – Tim