如何从请求响应中删除SOAP信封方法名称?

时间:2011-07-05 03:34:25

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

使用ASP.NET Webservice时,它会自动添加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>

1 个答案:

答案 0 :(得分:2)

嗯...你可以手动处理响应并流回你自己的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数据包的进一步评论,这必须由调用客户端完成,因为客户端构建了一个服务器用作指令的soap数据包,但操纵请求信封可能会影响它的处理方式或者实际上打破了服务器对肥皂包的处理。

考虑到所有这些,你可能会发现它更适合简单地实现一个自定义的httphandler,因为它会接受任何东西并可能返回任何内容,使用Web服务强加了一些基本格式规则,这些规则由soap标准的http处理程序所暗示。 ..

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

...

这更有帮助吗?