调用webservice时,我需要在调用某些操作时更改响应文本。
因此我创建了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对象并放置我的文本。
这是一种正确的方法吗?
它正在运作,但我认为我错过了一些东西
您怎么看?
答案 0 :(得分:4)
我不能给你一个最好的练习答案,但我自己这样做是因为我从一个旧的skool ASPX应用程序输出JSON,它运行完美。
所以我的答案是(出于个人经验):没有错。
答案 1 :(得分: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
课程中,你就可以了。