2012-10-26 105 views
4

調用webservice時,我需要在調用特定操作時更改響應文本。HttpModule更改響應

因此,我創建了HttpModule來捕獲響應並對其進行更改。

代碼如下:

public class BeginEnd : IHttpModule 
{ 

    public void Init(HttpApplication context) 
    { 
    context.EndRequest += (o, e) => 
    {  
     HttpContext currContext = HttpContext.Current; 

     NameValueCollection collection = currContext.Request.QueryString; 

     if (collection.Count > 0 
     && collection["op"] != null 
     && collection["op"] == "ChangeService") 
     { 
     string xmlOther = "<root>My Test</root>"; 

     currContext.Response.Clear(); 
     currContext.Response.Write(xmlOther); 
     currContext.Response.End(); 
     } 
    }; 

    } 

    public void Dispose() 
    { 
    } 
} 

所以你看,我只是清楚Response對象,並把我的文字。

是一個正確的方法來做到這一點?

它的工作,但我覺得我失去了一些東西

你覺得呢?

回答

4

我不能給你一個最佳實踐的答案,但我自己這樣做,當我從舊skool ASPX應用程序輸出JSON時,它可以完美地工作。

所以我的回答是(出於個人經驗):沒有錯。

3

您的方法可能會有效,但它看起來至少有一些與使用其默認處理程序處理請求相關的開銷,然後將處理結果丟棄。

一個更好的辦法可能是一個在this answer to a different question建議,即分配不同的處理程序,以當前處理的請求:

public class MyHttpModule : IHttpModule 
{ 
    public void Init(HttpApplication application) 
    { 
     application.PostAuthenticateRequest += app_PostAuthenticateRequest; 
    } 

    void app_PostAuthenticateRequest(object sender, EventArgs e) 
    { 
     var context = HttpContext.Current; 
     var queryString = context.Response.QueryString; 

     // queryString["op"] will never fail, just compare its value 
     if (queryString["op"] == "ChangeService") 
     { 
      context.RemapHandler(new MyHttpHandler()); 
     } 
    } 

    public void Dispose() { } 
} 

然後,只是把處理請求到MyHttpHandler類和你的邏輯」很好去。