为IIS中托管的WCF服务创建自定义.svc处理程序

时间:2011-09-19 16:51:10

标签: c# asp.net wcf iis-7

我正在IIS 7中托管一个wcf服务。我很好奇是否可以创建我自己的.svc HttpHandler映射和类来处理服务请求。

例如,如果我要拦截对以“.foo”扩展名结尾的文件的任何请求,我可以将其添加到我的web.config

<handlers>
     <add name="*.foo_**" path="*.foo" verb="*" type="MyServer.FooHttpHandler" />      
</handlers>

我可以在我的默认根目录中创建以下

的类
public class FooHandler: IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        // do stuff, validate?

        HttpContext.Current.Response.ClearContent();
        HttpContext.Current.Response.ClearHeaders();
        HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("filename={0}", url));
        HttpContext.Current.Response.AddHeader("Content-Type", "fooMimeType");
        HttpContext.Current.Response.WriteFile(url);
        HttpContext.Current.Response.End();
    }

    public bool IsReusable
    {
        get { return false; }
    }
}

是否可以使用wcf .svc请求执行此类操作?我不确定它是否完全相同,因为我没有必要提供文件来回复,我想拦截并代理响应。

或者是实现执行我所需的预服务逻辑的服务行为的更好方法吗?

2 个答案:

答案 0 :(得分:1)

你想要达到什么目的?不确定是否可以替换现有的* .svc http处理程序 - 但是您可以更轻松地做的是为WCF服务创建自己的自定义ServiceHostFactory。你基本上添加了* .svc文件的一个属性:

<%@ ServiceHost Language="C#" Debug="true" 
    Service="YourNamespace.YourService" 
    Factory="YourNamespace2.YourServiceHostFactory" %>

使用此功能,IIS现在将实例化您自己的YourServiceHostFactory,并要求您创建YourService类的实例。也许你可以在这里找到流程并做你需要做的事情?

答案 1 :(得分:0)

你可以使用ASP.NET Routing和一个IRouteHandler来返回你自己的IHttpHandler实现,如果你真的想要这样做的话 http://msdn.microsoft.com/en-us/library/system.web.routing.iroutehandler.gethttphandler.aspx http://msdn.microsoft.com/en-us/library/cc668201.aspx

我在过去设置WCF数据服务时已经这样做了,我不明白为什么它也不能在这里工作。