Vb.net 使用WCF返回普通的旧XML

Vb.net 使用WCF返回普通的旧XML,vb.net,wcf,rest,Vb.net,Wcf,Rest,这怎么会如此困难?为什么?返回没有名称空间和XML衰减的简单XML。使用XMLWriter创建XML很容易,如果我将其输出到一个文件中,那就太好了。你究竟怎样才能通过WCF返回内容呢。使用XML元素是没有好处的,因为您松开了XML声明,而使用字符串是没有好处的,因为输出被包装在一个元素中。无法返回XML文档,因为它无法序列化 我知道这个网站上有很多帖子,但是没有一个能回答这个问题。我正在使用VB.NET(天哪,我希望我有时间学习C#),即使使用IXmlSerializer,我也无法使数据契约正常

这怎么会如此困难?为什么?返回没有名称空间和XML衰减的简单XML。使用XMLWriter创建XML很容易,如果我将其输出到一个文件中,那就太好了。你究竟怎样才能通过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将不接受WCF自己添加的额外名称空间

我正在使用Visual Studio 2010提供的用于VB的在线Rest模板

救命啊!请一定有人有答案

下面是一些代码:

<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

公共函数创建(ByVal XMLBooking作为流)作为流
'对请求进行一些处理-这一切都很好。。。。。
作为字符串的Dim str
'此CreateResponseXML函数创建XML的字符串版本,该版本是使用XMLWriter构建的。
str=CreateResponseXML(True,vConfirmationID,sqlFuncs.BookingStatus(“已确认”),“”,“”)
Dim memoryStream作为新的memoryStream()
将streamWriter用作新的streamWriter(memoryStream)
streamWriter.Write(str)
streamWriter.Flush()
memoryStream.Position=0
返回存储器流
终端使用
端函数
为了增加麻烦,他们必须使用安全连接。我正在使用Visual Studio 2010提供的用于VB的在线Rest模板,与我在任何地方看到的普通模板相比,该模板大大减少了web.config中的条目。看起来像这样 :


我尝试在此代码之前返回一个MemoryStream,但他们得到的响应被包装在MemoryStream元素中,并且是gobbldegook(但这可能是因为我在web.config中输入了transferMode=“Streamed”条目。此版本完全不返回任何内容

有什么想法吗?

使用它有POX格式化程序(普通的旧Xml),它是干净的,没有任何名称空间

POX格式化程序使用 System.Runtime.Serialization.DataContractSerializer,但与 WCF REST Contrib xml格式化程序([在xml格式化程序下讨论 概述),不序列化数据协定命名空间或xml架构 属性,它不需要在xml中指定名称空间来 可以反序列化,并且不要求元素位于特定的 这使您能够提供和接受非常简单的xml


请参见

使用流作为返回值。

为此,我确实想到了这一点。如果接收者不使用Microsoft工具,他是否能够查看流中的文本?@tim绝对正确。您返回的只是一个字节流。别忘了将内容类型标题设置为适当的媒体类型。嗨,Darrel,我刚刚看到了h答:他们无法读取流。我正在使用和返回MemoryStream。这是我的问题吗?如何将内存流转换为正常流?@tim MemoryStream很好。我一直都在使用它们。你能发布一些代码来显示你是如何返回流的吗?嗨,Darrel,我已经发布了一些代码供你在我的原帖,希望有意义。
<?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>