我正在尝试使用.NET客户端消费轴Web服务,并且在设置WSE配置以使用它时遇到了一些麻烦。我知道WSE 3.0是一项过时的技术,但是我遇到了VS2005和.NET 2.0环境,因此我必须处理此。

当前,我已经创建了一个新的ASP.NET网站应用程序,并启用了WSE。它生成了一系列诸如WS:地址和WS:TIMESTAMP部分的部分,该部分无法处理服务器无法处理,我希望将其删除。我找不到配置设置可以执行此操作,因此经过一些搜索后,我开始使用soapextensions拦截消息并手动删除部分。

我目前的问题似乎是SoapeXtensions中的代码根本没有被执行。这是我的web.config-

<configuration>
  <configSections>
    <section name="microsoft.web.services3" type="Microsoft.Web.Services3.Configuration.WebServicesConfiguration, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </configSections>
  <appSettings>
    <add key="WebSvc.SecureService" value="<Trimmed>" />
  </appSettings>
  <connectionStrings />
  <system.web>
    <compilation debug="true">
      <assemblies>
        <add assembly="Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      </assemblies>
    </compilation>
    <authentication mode="Windows" />
    <webServices>
      <soapExtensionImporterTypes>
        <add type="Microsoft.Web.Services3.Description.WseExtensionImporter, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </soapExtensionImporterTypes>
      <soapServerProtocolFactory type="Microsoft.Web.Services3.WseProtocolFactory, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    </webServices>
  </system.web>
  <microsoft.web.services3>
    <security>
      <x509 verifyTrust="false" />
      <defaultTtlInSeconds value="0" />
      <timeToleranceInSeconds value="0" />
    </security>
    <diagnostics>
      <trace enabled="true" input="InputTrace.webinfo" output="OutputTrace.webinfo" />
    </diagnostics>
    <policy fileName="wse3policyCache.config" />
  </microsoft.web.services3>
</configuration>

和我的Web服务方法 -

[WebMethod]
[TestApplication.TraceExtensionAttribute]
public void SendTestMessage()
{
    WebSvc.B2BSecureServiceServiceWse svcClient = new WebSvc.B2BSecureServiceServiceWse();
    svcClient.SetPolicy("Policy1");
    WebSvc.B2BRequest request = new WebSvc.B2BRequest();
    WebSvc.B2BRequestHeader WebSvc= new WebSvc.B2BRequestHeader();
    // Set Request header properties
    request.header = requestHeader;
    request.msgPayload = ""; // Text removed

    try
    {
        WebSvc.Response response = svcClient.processRequest(request);
    }
    catch (Exception ex)
    { 

    }
}

这是我的soapextension类 -

public class Snoop : SoapExtension
{
    Stream oldStream;
    Stream newStream;
    string filename;

    // 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;
    }

    // When the SOAP extension is accessed for the first time, the XML Web
    // service method it is applied to is accessed to store the file
    // name passed in, using the corresponding SoapExtensionAttribute.  
    public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
    {
        return ((TraceExtensionAttribute)attribute).Filename;
    }
    // The SOAP extension was configured to run using a configuration file
    // instead of an attribute applied to a specific XML Web service
    // method.
    public override object GetInitializer(Type WebServiceType)
    {
        // Return a file name to log the trace information to, based on the
        // type.
        return "C:\\" + WebServiceType.FullName + ".log";
    }
    // Receive the file name stored by GetInitializer and store it in a
    // member variable for this specific instance.
    public override void Initialize(object initializer)
    {
        filename = (string)initializer;
    }
    //  If the SoapMessageStage is such that the SoapRequest or
    //  SoapResponse is still in the SOAP format to be sent or received,
    //  save it out to a file.
    public override void ProcessMessage(SoapMessage message)
    {
        switch (message.Stage)
        {
            case SoapMessageStage.BeforeSerialize:
                break;
            case SoapMessageStage.AfterSerialize:
                WriteOutput(message);
                break;
            case SoapMessageStage.BeforeDeserialize:
                WriteInput(message);
                break;
            case SoapMessageStage.AfterDeserialize:
                break;
        }
    }

    public void WriteOutput(SoapMessage message)
    {
        newStream.Position = 0;
        FileStream fs = new FileStream(filename, FileMode.Append,
            FileAccess.Write);
        StreamWriter w = new StreamWriter(fs);

        string soapString = (message is SoapServerMessage) ? "SoapResponse" : "SoapRequest";
        w.WriteLine("-----" + soapString + " at " + DateTime.Now);
        w.Flush();
        Copy(newStream, fs);
        w.Close();
        newStream.Position = 0;
        Copy(newStream, oldStream);
    }

    public void WriteInput(SoapMessage message)
    {
        Copy(oldStream, newStream);
        FileStream fs = new FileStream(filename, FileMode.Append,
            FileAccess.Write);
        StreamWriter w = new StreamWriter(fs);

        string soapString = (message is SoapServerMessage) ?
            "SoapRequest" : "SoapResponse";
        w.WriteLine("-----" + soapString +
            " at " + DateTime.Now);
        w.Flush();
        newStream.Position = 0;
        Copy(newStream, fs);
        w.Close();
        newStream.Position = 0;
    }

    void Copy(Stream from, Stream to)
    {
        TextReader reader = new StreamReader(from);
        TextWriter writer = new StreamWriter(to);
        writer.WriteLine(reader.ReadToEnd());
        writer.Flush();
    }

}
// Create a SoapExtensionAttribute for the SOAP Extension that can be
// applied to an XML Web service method.
[AttributeUsage(AttributeTargets.Method)]
public class TraceExtensionAttribute : SoapExtensionAttribute
{

    private string filename = "c:\\log.txt";
    private int priority;

    public override Type ExtensionType
    {
        get { return typeof(Snoop); }
    }

    public override int Priority
    {
        get { return priority; }
        set { priority = value; }
    }

    public string Filename
    {
        get
        {
            return filename;
        }
        set
        {
            filename = value;
        }
    }
}

我猜想我在尝试将Soapextension分配给该方法调用时做错了什么,因此,任何帮助都非常感谢!

有帮助吗?

解决方案

对于任何遇到这个问题的人来说,这是我如何使用肥皂而解决的。这是MSDN的过程 - http://msdn.microsoft.com/en-us/library/aa528788.aspx

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top