繁体   English   中英

对.ashx文件的ajax调用

[英]ajax call to .ashx file

有人可以检查为什么我的.ashx文件没有触发警报的原因吗

function setHeartbeat() {
        setInterval("heartbeat()", 20000); 
           }

         function heartbeat() {
             alert('ajax called');
                 $.ajax({
                     type: "GET",
                     url: "SessionHeartbeat.ashx",
                     data: null,
                     success: function (data) {
                         beatHeart(30);
                         setHeartbeat();

    }});
    }

.ashx文件看起来像这样,称为SessionHeartbeat.ashx

public class SessionHeartbeat : IHttpHandler, IRequiresSessionState
    {
        public bool IsReusable { get { return false; } }

        public void ProcessRequest(HttpContext context)
        {
            context.Session["Heartbeat"] = DateTime.Now;
        }
    }
}

这是我的web.config

<httpHandlers>
    <add verb="GET,HEAD" path="SessionHeartbeat.ashx" validate="false" type="SessionHeartbeat"/>
</httpHandlers>

如果使用处理程序类,则必须将它们添加到web.config中的<httpHandlers>标记中。

您拥有的是一个通用处理程序 您无需执行任何操作,因此可以将其从web.config中的<httpHandlers>标记中删除。

只要您可以从客户端浏览器访问SessionHeartbeat.ashx ,以下代码就应该起作用。

<script>

    setInterval(function() {
        $.ajax({
            type: "GET",
            url: "<%= ResolveUrl("~/SessionHeartbeat.ashx") %>",
            data: null,
            success: function (data) {
                console.log('Heartbeat called at ' + data);
            }
        });
    }, 20000);

</script>

public class SessionHeartbeat : IHttpHandler, IRequiresSessionState
{
    public void ProcessRequest(HttpContext context)
    {
        var dateTimeNow = DateTime.Now;
        context.Session["Heartbeat"] = dateTimeNow;
        context.Response.Write(dateTimeNow);
    }

    public bool IsReusable { get { return false; } }
}

您提到的示例在更新web.config之后起作用:

<configuration>
      <!--Other settings-->
      <system.webServer>
        <validation validateIntegratedModeConfiguration="false"/>
      </system.webServer>
      <system.web>
          <httpHandlers>
             <add verb="GET,HEAD" path="SessionHeartbeat.ashx" validate="false" type="SessionHeartbeat"/>
          </httpHandlers>
      </system.web>
</configuration>

但这取决于IIS版本及其配置方式。 请参阅以下答案: 通用处理程序不适用于IIS 它解释说,在某些情况下,通用处理程序仍需要在web.config中进行设置,而当我按照您发布的链接中的示例进行操作时,就是这种情况。

另外我之前已经在ProcessRequest中添加了响应写

public void ProcessRequest(HttpContext context)
{
    context.Response.Write("Hello World");
    context.Session["Heartbeat"] = DateTime.Now;
}

如果将其部署在IIS中,则可能需要注册处理程序,但在我的IIS Express中则没有必要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM