【发布时间】: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