【问题标题】:How do I remove SOAP envelope method names from request response?如何从请求响应中删除 SOAP 信封方法名称?
【发布时间】:2011-07-05 03:34:24
【问题描述】:

使用 ASP.NET Web 服务时,它会自动添加 MethodNameResultMethodaNameResponse

有没有简单的方法不包括它们,我们可以对请求做同样的事情吗?

即,从

中删除<tem:HelloWorld><tem:xml>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:HelloWorld>
         <tem:xml>

这是响应示例

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <HelloWorldResponse xmlns="http://tempuri.org/">
         <HelloWorldResult>
         </HelloWorldResult>
      </HelloWorldResponse>
   </soap:Body>
</soap:Envelope>

【问题讨论】:

  • 它将成为另一个服务的代理服务,所以不需要添加额外的东西,所有这个 servrivce 所做的就是将它接收到的 xml 传递给另一个服务。我的 WS 具有像 Public Xmldocument Hellowork ( XmlDocument xmltext) 这样的方法定义,因此 xmlvalue 上的任何内容都会传递给另一个 ws。所以我的 ws 将被包裹在方法 xml 周围,所以尽量避免使用这些

标签: c# .net asp.net web-services


【解决方案1】:

嗯...您可以手动处理响应并返回您自己的 xml 字符串,但您为什么要这样做???这会破坏针对它构建的任何客户端应用程序。

编辑:(称之为阐述):

基本上你需要做的是创建你自己的“肥皂扩展”......

public class MySOAPExtension : SoapExtension
{

     Stream oldStream;
     Stream newStream;

     // Save the Stream representing the SOAP request or SOAP response into
     // a local memory buffer.
     public override Stream ChainStream( Stream stream )
     {
            oldStream = stream;
            newStream = new MemoryStream();
            return newStream;
     }

    public override void ProcessMessage(SoapMessage message)
    {
       switch (message.Stage)
        {
            case SoapMessageStage.BeforeDeserialize:
                // before the XML deserialized into object.
                break;
            case SoapMessageStage.AfterDeserialize:
                break;        
            case SoapMessageStage.BeforeSerialize:
                break;
            case SoapMessageStage.AfterSerialize:
                break;            
            default:
                throw new Exception("Invalid stage...");
        }       
    }
}

您可以从这里选择您感兴趣的流程的哪一部分,如果需要,可以将其与此处找到的信息相结合...

http://msdn.microsoft.com/en-us/library/ms525585%28v=vs.90%29.aspx

... 将自己的 xml 扔回客户端

这并不容易,并且确实需要对服务生命周期有相当多的了解,但至少这遵循了用于服务请求的典型 asp.net 模型...

http://msdn.microsoft.com/en-us/library/ms178473.aspx

我认为您只对处理上述开关块中的“SoapMessageStage.AfterSerialize”以操纵肥皂信封感兴趣。

后记:

根据您对操作请求肥皂包的进一步评论,这必须由调用客户端完成,因为客户端构建了一个服务器用作指令的肥皂包,但是操作请求信封可能会影响它的处理方式或者实际上破坏了处理soap数据包的服务器。

考虑到所有这些,您可能会发现简单地实现自定义 httphandler 更合适,因为它可以接受任何内容并可能返回任何内容,使用 Web 服务会强制执行一些基本的格式化规则,而这些规则是 soap 标准 http 处理程序所不具备的。 ..

http://support.microsoft.com/kb/308001

...

这样更有帮助吗?

【讨论】:

  • 你能对请求 XML 做同样的事情吗?
  • -1 因为没有给出任何关于如何“手动处理响应”的想法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 1970-01-01
相关资源
最近更新 更多