【问题标题】:HttpHandler for prefix in urlurl 中前缀的 HttpHandler
【发布时间】:2014-07-02 11:42:04
【问题描述】:

我正在尝试将 aspx 中的 http 调用转换为 https

背景:我在 https 站点中有一个 Aspx 页面。在该页面上我参考了谷歌的脚本

Aspx 页面参考:

 <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js" type="text/javascript"></script>

我已经为 Prefix Http 创建了一个 HttpHandler IHttpHandler 接口实现:

public class HttpToHttpsHandler : IHttpHandler
{
    public bool IsReusable
    {
        get { return false; }
    }

    public void ProcessRequest(HttpContext context)
    {
        try
        {
            context.Response.ContentType = "text/plain";
            if (context.Request.RawUrl.Contains("http:"))
            {
                string newUrl = context.Request.RawUrl.Replace("http", "https");
                context.Server.Transfer(newUrl);

            }
        }
        catch (Exception)
        {

            throw;
        }
    }
}

Web.Config文件注册码:

  <httpHandlers>

    <add verb="*" path="http:*" type="HttpToHttpsHandler , App_Code"/>

  </httpHandlers>

但我没有在 Http 处理程序类中获得控制权。可能是什么错误。

【问题讨论】:

  • 每当我创建一个处理程序时,我都会在主 Web 目录之外创建一个名为 handlers 的文件夹,并创建一个“通用”处理程序 (.ashx)。我从 js 调用处理程序,“/handlers/nameOfHandler.ashx?arg1=121212”...
  • 是否要将页面上&lt;script&gt;标签中的URL设置为HTTPS?因为如果是这样,使用 HttpHandler 不会这样做,因为没有浏览器会从您的服务器请求该脚本。根据父页面自动强制脚本解析为 http 或 https 的最简单方法是将src 设置为src=//the.url.com。浏览器会根据页面加载的内容自动在// 之前插入http:https:。这适用于所有类型的绝对 url、href、img src 等。
  • 我同意@siva.k ...您不需要(或想要)处理程序为您执行此操作。只需按照描述使用 // 引用您的脚本,您将获得所需的行为。

标签: c# asp.net .net http


【解决方案1】:

我想知道您的程序集是否称为“App_Code”。在您的类型声明中,您必须输入程序集名称,而不是 C# 文件的文件夹名称。

【讨论】:

  • 我的程序集名称可能是什么。是我的项目名称吗
  • 你可以在你的项目的Properties Page中找到它,通常是你的项目名称。
  • 成功了吗?正如其他人所建议的那样,这个问题不是您使用此代码的主要问题,但至少会给您一个起点。
【解决方案2】:

据我所知,path 属性是相对位置,它只能采用以下两个值之一:名称/文件名或要映射的扩展名/文件扩展名。喜欢

      <add verb="*" path="*.SampleFileExtension" 
         type="Example1 " />       

或者

      <add verb="*" path="demo.*" 
         type="Example1 " />     

我尝试了这两种方法的组合,它也有效,这表明以 test 开头的任何内容以及任何扩展都将逐个处理程序处理:

 <add  verb="*" path="test*.*"
                  name="HelloWorldHandler"
                  type="demo.HelloWorldHandler,App_Code" />

但请注意,它是一个相对路径,因此这意味着它不包含 URL 中的 httphttps 值,因此不能使用 Handler验证 URL。

【讨论】:

    【解决方案3】:

    您需要定义包含HttpToHandler 类的程序集名称。 处理程序在您的程序集中定义为类HttpToHttpsHandler,如果它在同一个项目中,那么它将是您的应用程序名称。 通过这个article

    <httpHandlers>
          <add verb="*" path="*.aspx" 
             type="HttpToHttpsHandler , AssemblyName" />
        </httpHandlers> 
      </system.web>
    

    if (!Request.IsLocal && !Request.IsSecureConnection)
    {
        string redirectUrl = Request.Url.ToString().Replace("http:", "https:");
        Response.Redirect(redirectUrl);
    }
    

    HttpRequest.IsSecureConnection 属性决定HTTP 连接是否使用安全套接字(HTTPS)。-MSDN

    【讨论】:

    • 但是它会捕获从 http 处理程序类中的 aspx 页面向 google apis 发出的请求
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多