使用WCF返回普通的旧XML

时间:2011-10-22 09:52:03

标签: vb.net wcf rest

这怎么这么难以及为什么?返回没有名称空间和XML decaration的简单XML。使用XML Writer创建XML很容易,如果我将它输出到文件那么好。你怎么能通过WCF返回内容。使用XML元素是不好的,因为你松开XML声明并且使用字符串是不好的,因为输出被包含在< string>中。元件。无法返回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似乎全部放入的额外名称空间。

我正在使用适用于Visual Studio 2010的VB在线休息模板。

帮助!请!有人必须得到答案吗?

以下是一些代码:

<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

要添加到hassel,他们必须使用安全连接。我正在使用可用于Visual Studio 2010的VB在线休息模板,与我在任何地方看到的常规条目相比,它显着减少了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(但这可能是因为我在web中省略了transferMode =“Streamed”条目.config。这个版本什么都不返回。

任何想法?

2 个答案:

答案 0 :(得分:1)

使用WCFRestContrib它有POX格式化程序(Plain Old Xml),它是干净的,没有任何名称空间。

  

POX格式化程序使用   System.Runtime.Serialization.DataContractSerializer,但不像   WCF REST Contrib xml格式化程序([在Xml Formatter下讨论   概述),不序列化数据协定命名空间或xml架构   属性,它不需要在xml中指定名称空间   反序列化,它不要求元素具体   订购。这使您可以提供和接受非常简单的xml。

请参阅POX Formatter Overview

答案 1 :(得分:1)

使用Stream作为返回值。