我正在尝试构建一个操作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用户的任何位置?
答案 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就像冠军一样。