【问题标题】:Deploying an HttpHandler web service部署 HttpHandler Web 服务
【发布时间】:2011-02-21 17:03:44
【问题描述】:

我正在尝试构建一个网络服务来处理 http 请求 POST 和 GET。

这是一个示例:

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 必须在模块列表中。

好的


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

我知道文件扩展名的请求路径是什么……而且我知道名称(可以随意命名),所以它一定是我正在努力解决的 Type 字段。到目前为止,在应用程序文件夹(在 IIS 中)中,我只有 MyHandler.cs 和 web.config(当然还有一个扩展名为我正在尝试为其创建处理程序的文件!)

edit3:进度

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

HTTP 错误 404.3 - 未找到 由于扩展配置,无法提供您请求的页面。如果页面是脚本,请添加 handler。如果要下载文件,请添加 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;
            }
        }

    }
}

我添加Handler如下:

请求路径:*.whatever 类型:MyHandler(类名 - 根据示例,这看起来是正确的!) 姓名:whatever

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

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

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

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

直接问题

1) 网站需要处于 CLASSIC 模式还是 INTEGRATED 模式?我在在线材料中没有找到任何关于此的参考,无论是否应该。

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

【问题讨论】:

  • 您使用的是哪个版本的 .NET?
  • @John Saunders 3.5 SP1 我很确定...为什么重要?

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


【解决方案1】:

请回答你的问题:

我不知道第一个(经典或综合)的答案;但我可以帮助第二个...

是的,您需要先编译它。我从未尝试将 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

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

<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/应用程序框架中使用了 HttpHanldrs,您可能会在那里找到一些有用的代码 (?):http://morphfolia.codeplex.com/

【讨论】:

  • 我最终自己解决了这个问题,但这是我需要的完美详细答案。希望它会帮助别人,感谢发布。 (哦,我从未确认过,但我认为经典是用于在 IIS7 中配置 IIS 6 及以下站点)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    相关资源
    最近更新 更多