2012-01-24 80 views
7

我有一個在IIS 7下託管的Web服務(不是WCF服務),Web服務有兩個方法:method1和method2。IIS 7記錄Web服務方法

我期待區分方法1的請求和方法2的請求,而不修改Web服務代碼。

在IIS 7日誌下,我可以看到Web服務的請求,Web服務URL在「cs-uri-stem」字段下記錄,但「cs-uri-query」字段爲空。

有沒有辦法記錄Web服務方法的請求,而無需修改Web服務代碼?

+0

你ASMX非常有限。你應該轉移到WCF,這很容易。 –

+0

這怎麼可以使用WCF完成?這可能對我有所幫助,ASMX服務調用WCF服務,並且我可以訪問IIS和託管WCF的機器。 –

+1

只需打開[WCF Tracing](http://msdn.microsoft.com/zh-cn/library/ms730342.aspx)。 –

回答

3

您可以在處理管道的各種方法中記錄所有傳入的請求。例如,在你的Global.asax添加一個處理BeginRequest

Application_BeginRequest(object sender, EventArgs e) 
{ 
    HttpApplication app = (HttpApplication)sender; 
    HttpContext ctx = app.Context; 

    var requestUrl = ctx.Request.Url; 

    // the uri should be of a form: 
    // http://yoursite/theservice.asmx/MethodName 
} 
+2

我不想修改應用程序代碼,應用程序已經在生產環境中運行......我不知道是否有辦法從IIS級別這樣做! –

-1

下面是來自微軟的官方公報文章: http://support.microsoft.com/kb/313437

1-啓動Internet Information Services(IIS)管理器。

2-展開ServerName,然後展開網站或FTP站點。用鼠標右鍵單擊要啓用日誌記錄的網站或FTP站點,然後單擊「屬性」。

3-單擊網站選項卡,或單擊FTP站點選項卡。

4-單擊以選中啓用日誌複選框。

5-在「活動日誌格式」框中,單擊要使用的格式。

6-單擊屬性,然後指定所需的設置。例如,如果您使用W3C擴展日誌文件格式,請按照下列步驟操作:

a。如果您正在運行IIS 6.0,請單擊常規選項卡。如果您正在運行IIS 5.0或IIS 4.0,請單擊常規屬性選項卡。指定要用於創建新日誌文件的計劃。例如,要每天創建一個新的日誌文件,請單擊每日。

b。如果要使用本地時間,請單擊以選中使用文件命名和翻轉複選框的本地時間。

注意午夜本地時間用於除W3C擴展日誌文件格式之外的所有日誌文件格式。默認情況下,W3C擴展日誌文件格式使用午夜協調世界時(格林尼治標準時間)。要使用本地午夜時間,請單擊以選中使用本地時間進行文件命名和翻轉複選框。

c。如果您正在運行IIS 6.0,請單擊「高級」選項卡。如果您正在運行IIS 5.0或IIS 4.0,請單擊擴展屬性選項卡。

d。指定您想要的選項。例如,指定「自定義數據」部分中列出的屬性。點擊確定。

e。點擊確定。

+0

我在這些日誌中看不到Web服務調用,而且我也沒有看到錯誤... – DestyNova

1

多年後,我不得不使用數百種方法訪問ASMX,並且無法將其轉換爲WCF。這是一個ASMX擴展點,它允許您在不訪問所有方法的情況下記錄方法名稱。在這裏,我使用log4net的記錄方法名,因人而異

首先,創建一個類的SoapExtension:

namespace MyNamespace { 
    public class WebMethodLogger : SoapExtension 
    { 
     private static readonly ILog _log = LogManager.GetLogger(typeof(WebMethodLogger)); 

     public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute) 
     { 
      return null; //No state 
     } 

     public override object GetInitializer(Type serviceType) 
     { 
      return null; //No state 
     } 

     public override void Initialize(object initializer) 
     { 
      //Do nothing 
     } 

     public override void ProcessMessage(SoapMessage message) 
     { 
      if (message.Stage == SoapMessageStage.AfterDeserialize) 
       _log.Debug(message.MethodInfo.MethodInfo.Name); 
     } 
    } 
} 

然後,註冊在你的web.config擴展:

<system.web> 
... 
    <webServices> 
     <soapExtensionTypes> 
      <add type="MyNamespace.WebMethodLogger, MyAssembly" 
       priority="1" 
       group="High" /> 
     </soapExtensionTypes> 
    </webServices> 
... 
</system.web>