部署HttpHandler Web服务

时间:2010-05-20 05:36:43

标签: c# visual-studio-2008 web web-services httphandler

我正在尝试构建一个操作http请求POST和GET的Web服务。

以下是一个示例:

public class CodebookHttpHandler: IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        if (context.Request.HttpMethod == "POST")
        {
            //DoHttpPostLogic();
        }
        else if (context.Request.HttpMethod == "GET")
        {
            //DoHttpGetLogic();
        }
    }
...

public void DoHttpPostLogic()
{
...
}
public void DoHttpGetLogic()
{
...
}

我需要部署这个,但我正在努力如何开始。大多数在线参考资料显示制作一个网站,但实际上,我想要做的就是在发送HttpPost时做出回应。我不知道该在网站上放什么,只想让代码运行。

修改 我正在关注this网站,正是我正在尝试做的事情。

我已经设置了网站,我在.cs文件中有处理程序的代码,我编辑了web.config以添加我需要的文件扩展名的处理程序。现在我在第3步,告诉IIS有关此扩展并将其映射到ASP.NET。我也在使用IIS 7,因此界面与截图略有不同。这是我遇到的问题:

1) Go to website
2) Go to handler mappings
3) Go Add Script Map
4) request path - put the extension I want to handle 
5) Executable-  it seems i am told to set aspnet_isapi.dll here. Maybe this is incorrect?
6) Give name
7) Hit OK button:

添加脚本地图

您想要允许此ISAPI扩展吗?单击“是”将带有“允许”条目的扩展名添加到ISAPI和CGI限制列表,或者将现有扩展条目更新为ISAPI和CGI限制列表中的“允许”。

否取消


8) Hit Yes

添加脚本地图

此处理程序所需的指定模块不在模块列表中。如果要添加脚本映射处理程序映射,则IsapiModule或CgiModule必须位于模块列表中。

确定


编辑2 :刚刚发现托管处理程序与托管代码中的处理程序有关,脚本映射是帮助配置可执行文件和模块映射以使用http模块。所以我应该使用选项1 - 添加托管处理程序。

我知道我的请求路径是什么文件扩展名...我知道名字(可以随便调用它),所以它必须是我正在努力的类型字段。到目前为止,在应用程序文件夹(在IIS中)我只有MyHandler.cs和web.config(当然也是一个带有扩展名的文件,我正在尝试为其创建处理程序!)

edit3:进度

所以现在我有代码和web.config设置我测试看看我是否可以浏览到filename.CustomExtension文件:

HTTP错误404.3 - 未找到 由于扩展配置,无法提供您请求的页面。如果页面是脚本,请添加处理程序。如果要下载文件,请添加MIME映射。

因此,在IIS7中,我转到Handler Mappings并将其添加到。See this MSDN example, it is exactly what I am trying to follow

该课程如下:

using System.Web;

namespace HandlerAttempt2
{
    public class MyHandler : IHttpHandler
    {
        public MyHandler()
        {
            //TODO: Add constructor logic here
        }

        public void ProcessRequest(HttpContext context)
        {
            var objResponse = context.Response;
            objResponse.Write("<html><body><h1>It just worked");
            objResponse.Write("</body></html>");
        }

        public bool IsReusable
        {
            get
            {
                return true;
            }
        }

    }
}

我按如下方式添加处理程序:

请求路径:*.whatever 键入:MyHandler(类名称 - 根据示例显示正确!) 姓名:whatever

尝试再次浏览自定义文件(这在应用程序池中为集成):

HTTP错误500.21 - 内部服务器错误 处理程序“无论”在其模块列表中有一个错误的模块“ManagedPipelineHandler”

尝试再次浏览自定义文件(这在应用程序池中为 CLASSIC ):

HTTP错误404.17 - 未找到 请求的内容似乎是脚本,静态文件处理程序不会提供。

直接问题

1)网站是否需要处于CLASSIC或INTEGRATED模式?我在网上资料中没有找到任何参考,无论是否应该。

2)我是否必须将MyHandler.cs编译为.dll,或者我可以将其保留为.cs?它需要位于bin文件夹中,还是只需要位于root用户的任何位置?

2 个答案:

答案 0 :(得分:2)

重新提问:

我不知道第一个答案(CLASSIC或INTEGRATED);但我可以帮助第二个......

是的,你需要先编译它。我从来没有尝试过将dll部署到bin以外的任何地方,因为这是我将其置于其他任何地方的标准,即使它确实有效。

我部署HttpHandlers的方式很简单 - 在web.config中完成了所有艰苦的工作,我不得不进入IIS来更改任何设置。

首先,对于要由ASP.NET处理的http请求,您需要使用已经传送到ASP.NET的请求后缀 - 如.aspx或ashx。如果你想使用别的东西,你将需要配置IIS来执行此操作,如上面的托管处理程序img。

我倾向于使用 .ashx ,例如:http://localhost/foo/my/httphandler/does/this.ashx

您需要做的就是(假设您已将HttpHandler编译成DLL并将其部署到站点中),请添加必要的配置。

<configuration>
   <system.web>
       <httpHandlers>
            <add verb="*" 
                 path="*.ashx" 
                 type="MyApp.PublishingSystem.HttpHandlers.GroovyHandler, MyApp.PublishingSystem" />
       </httpHandlers>
   </system.web>
</configuration>

显然(?)您可以使用路径更改/限制范围,例如:

path="*.ashx" 
path="*ListWidgets.ashx" 
path="*Admin/ListWidgets.ashx" 

此处有更多信息:http://msdn.microsoft.com/en-us/library/ms820032.aspx

要注意的一个重要问题是在配置中声明HttpHandlers的顺序;从我记得的那些首先宣布的先例。所以在这个例子中......

<add verb="*"  path="*foo.ashx" type="MyApp.PublishingSystem.HttpHandlers.FooHandler, MyApp.PublishingSystem" />
<add verb="*"  path="*.ashx" type="MyApp.PublishingSystem.HttpHandlers.GroovyHandler, MyApp.PublishingSystem" />

... groovy处理程序将处理所有 HttpRequests 以foo.ashx结尾的任何内容

顺便说一句,我在我的开源.net CMS / app框架中使用了HttpHanldrs,你可能会在那里找到一些有用的代码(?):http://morphfolia.codeplex.com/

答案 1 :(得分:1)

确保正确设置了应用程序池的.NET Framework版本...

我在.NET 2.0应用程序池上部署了.NET 4.0 Web应用程序并出现此错误。将应用程序池设置为v4.X,ashx就像冠军一样。