如何从.cs文件中调用HttpHandler(ASP.NET)

8
我已经为我的jQuery AJAX调用创建了一个HTTP处理程序。下面是jQuery的调用代码:
 $.ajax({
    url: "Services/name.ashx",
    contentType: "text/plain",
    data: {
        CustMobile: a,
        CustName: b,
        CustEmail: c
    },
    contentType: "application/json; charset=utf-8",
    success: function (data) {
        $("#loading").hide();
    },
    error: function () {
        $("#loading").hide();
    }
});

现在我的问题是,我能否通过我的代码后台调用name.ashx处理程序。我正在使用C#的asp.net。我知道可以通过Response.write("")写入整个脚本部分来调用它,也可以使用页面方法的Register Script。
但是,有没有办法通过C#发送请求到处理程序,并从处理程序获取响应。
谢谢。

我找到了类似的问题,链接如下:https://dev59.com/6lnUa4cB1Zd3GeqPdLZJ - शेखर
但是在那里它也需要上下文作为参数,而且我不知道如何获取响应。请帮忙。 - शेखर
2个回答

22

您可以在代码后台使用HttpWebRequest(System.Net命名空间)调用任何HTTP资源。

示例

HttpWebRequest request = (HttpWebRequest) WebRequest.Create("<YourDomain>/Services/name.ashx?CustMobile=ValueOfA&CustName=ValueOfB&CustEmail=ValueOfC");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
你需要一个绝对路径,但如果你不想硬编码域名,可以从HttpContext中获取你的域名或服务器URL。

更多信息


我有一个小问题,我必须放绝对路径还是相对路径可以工作。因为它(处理程序)是我的应用程序的一部分。 - शेखर
你需要一个绝对路径。如果你不想硬编码域名,可以从HttpContext获取你的域名或服务器URL。 - dknaack
(HttpWebResponse)request.GetRequestStream(); 无法将其转换为响应。 - शेखर
我遇到了一个错误:“远程服务器返回了一个错误:(400)Bad Request”。我的HTTP处理程序还实现了IRequiresSessionState接口,因为我需要在那里进行一些会话操作。这可能是个问题。 - शेखर
1
感谢@dknaack,由于会话的复杂使用,我没有解决我的问题,但是我能够通过您建议的方式访问该处理程序。唯一的问题是会话。 - शेखर
显示剩余3条评论

6
我发现了另一种做法。如果你想从同一个项目中访问它,那么非常容易。
使用代码后端的步骤:
1. 创建一个类并命名。 2. 你可以创建该类的对象。 3. 然后你可以调用 ProcessRequest。 4. 它将执行该处理程序。
假设我已经创建了以下处理程序。
public class HandlerName : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
       //some code
    }
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

所以您可以按以下方式使用它

HandlerName obj=new HandlerName();
obj.ProcessRequest(HttpContext);

请注意,您可以获取当前上下文并在处理请求时传递它。 了解有关HttpContext的更多信息 [1 2]

编辑1

如果需要,您还可以重载ProcessRequest方法。

public class HandlerName : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
      // some code
    }
    public void ProcessRequest(HttpContext context, string someString)
    {
       // do your coding here
    }
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

如果您不想覆盖该方法,您可以按照以下方式传递值:
您可以将该值添加到HttpContext.Current.Items中。
HttpContext.Current.Items["ModuleInfo"] = "Custom Module Info"

并在 ProcessRequest 方法中按以下方式获取它
public class HandlerName : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
      string contextData = (string)(HttpContext.Current.Items["ModuleInfo"]);
    }
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接