2011-10-22 51 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