如何从请求响应中删除SOAP信封方法名称
本文关键字:方法 SOAP 删除 请求 响应 | 更新日期: 2023-09-27 18:01:15
使用ASP.NET Web服务时,它会自动添加MethodNameResult
和MethodaNameResponse
。
有没有一种简单的方法可以不包括它们,我们可以对请求进行同样的处理?
即,从中删除<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>
um。。。您可以手动处理响应并流式返回您自己的xml字符串,但为什么要这样做???这将破坏任何基于它构建的客户端应用程序。
编辑:(称之为阐述(:
本质上,你需要做的是创建自己的"soap扩展"。。。
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数据包的进一步评论,当客户端构建一个服务器用作指令的soap数据包时,必须由调用客户端来完成,但是,操作请求信封可能会影响它的处理方式,或者实际上会破坏服务器处理soap数据包。
考虑到所有这些,您可能会发现更适合简单地实现自定义http处理程序,因为它可以接受任何内容并可能返回任何内容,使用web服务会强加一些基本的格式化规则,这些规则是由soap标准http处理程序所暗示的。。。
http://support.microsoft.com/kb/308001
这样更有帮助吗?