Question

Je suis en train de consommer un service Web Axis avec un client .NET et je vais avoir quelques problèmes la mise en place de la configuration de WSE à travailler avec elle. Je sais que WSE 3.0 est une technologie dépassée, mais je suis coincé avec un environnement VS2005 et .NET 2.0, donc je vais devoir travailler avec cela.

Actuellement, j'ai créé une nouvelle application ASP.NET Site Web et activé WSE sur elle. Il generages un groupe de sections comme le WS: Adressage et WS: sections Horodatage de ce que le serveur ne peut pas gérer et je cherche à les supprimer. Je ne pouvais pas trouver un cadre de configuration pour le faire, donc après quelques recherches sur, j'ai commencé à travailler avec SoapExtensions pour intercepter le message et supprimer les sections manuellement.

Mon problème semble actuellement que le code dans les SoapExtensions ne s'exécuté du tout. Voici mon 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>

Et ma méthode de service 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)
    { 

    }
}

Et voici ma SoapExtension classe -

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

Je devine que je fais quelque chose de mal en essayant d'assigner le SoapExtension à cet appel de méthode, de sorte que toute aide est très appréciée!

Était-ce utile?

La solution

Pour toute personne qui vient à travers ce problème, voici comment je l'ai résolu en utilisant SoapFilters. Voici le processus de MSDN - http://msdn.microsoft.com/en-us /library/aa528788.aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top