2012-04-05 2 views
0

aspx 페이지와 사용하는 asmx 서비스간에 전송되는 soap 메시지를 표시하는 간단한 테스트 프로그램을 만들려고합니다. SoapExtension 클래스를 수행하고 내 web.config를 수정하려고 시도했지만 아무 것도 전혀 작동하지 않는 것 같습니다.SoapExtension을 사용하여 asmx 웹 서비스에서 원시 SOAP 메시지를 표시하는 방법

웹 설정이 :

이 가 이 서비스에서하여 HelloWorld 함수를 호출하고 라벨에 반환 된 문자열을두고

간단한 호출 페이지

<?xml version="1.0"?> 

<!-- 
    For more information on how to configure your ASP.NET application, please visit 
    http://go.microsoft.com/fwlink/?LinkId=169433 
    --> 

<configuration> 

    <connectionStrings> 
    <add name="ApplicationServices" 
     connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true" 
     providerName="System.Data.SqlClient" /> 
    </connectionStrings> 

    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 

    <membership> 
     <providers> 
     <clear/> 
     <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" 
      enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" 
      maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" 
      applicationName="/" /> 
     </providers> 
    </membership> 

    <webServices> 
     <soapExtensionTypes> 
     <add type="TraceExtension.TraceExtension, TraceExtension" 
      priority="1" group="High" /> 
     </soapExtensionTypes> 
    </webServices> 

    <profile> 
     <providers> 
     <clear/> 
     <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/> 
     </providers> 
    </profile> 

    <roleManager enabled="false"> 
     <providers> 
     <clear/> 
     <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" /> 
     <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" /> 
     </providers> 
    </roleManager> 

    </system.web> 


    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 
    <system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name=""> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    <bindings /> 
    <client /> 
    </system.serviceModel> 
</configuration> 
: 여기

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.Services; 
using System.Web.Services.Protocols; 
using System.IO; 

namespace CS606_SOAP 
{ 
    public partial class _Default : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 

     protected void Button1_Click(object sender, EventArgs e) 
     { 
      WebService1 svc = new WebService1(); 
      Label1.Text = svc.HelloWorld(); 
     } 
    } 
} 

가있다 이것은 내가 무엇을 가지고 asmx :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Services; 
using System.Web.Services.Protocols; 

namespace CS606_SOAP 
{ 
    /// <summary> 
    /// Summary description for WebService1 
    /// </summary> 
    [WebService(Namespace = "http://tempuri.org/")] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    [System.ComponentModel.ToolboxItem(false)] 
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService] 
    public class WebService1 : System.Web.Services.WebService 
    { 
     [TraceExtension.TraceExtension] 
     [WebMethod] 
     public string HelloWorld() 
     { 
      return "Hello World"; 
     } 
    } 

} 

또한 여기에있는 클래스의 .dll 파일을 참조하십시오.

using System; 
using System.Web.Services; 
using System.Web.Services.Protocols; 
using System.IO; 
using System.Net; 

// Define a SOAP Extension that traces the SOAP request and SOAP 
// response for the XML Web service method the SOAP extension is 
// applied to. 
namespace TraceExtension 
{ 
    public class TraceExtension : 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 = "log.txt"; 
     private int priority; 

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

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

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

잘 실행되지만 실제로는 log.txt 파일에 기록되지 않습니다. 여기에 뭐가 잘못 됐는지 알아? .Net 4.0 btw 사용.

+0

또한 asmx 파일과이를 호출하는 클라이언트 웹 페이지는 명확하지 않은 경우 동일한 프로젝트에 있습니다. asmx 서비스에 대한 별도의 웹 참조가 없습니다. – SneakyArab

답변

1

Wireshark 또는 SoapUI과 같은 것을 사용하지 않는 이유는 무엇입니까? 그것은 당신에게 많은 코딩을 저장할 것입니다.

+0

코드로 구현해야합니다. – SneakyArab

+0

그럼 신경 쓰지 마세요 :) – richk

관련 문제