扩展 IsAjaxRequest() 以包含获取 api 请求

Posted

技术标签:

【中文标题】扩展 IsAjaxRequest() 以包含获取 api 请求【英文标题】:Extend IsAjaxRequest() to include fetch api requests 【发布时间】:2018-05-01 08:58:05 【问题描述】:

我目前正在使用 MVC5 构建一个站点,并且在发出 ajax 请求时需要提供不同的内容。

通常我们使用 jQuery 并使用 $.ajax 发出 ajax 请求,但最近我们已经转向使用 fetch api。但是,使用 fetch api 的请求没有向 MVC 注册为 ajax 请求,因此使用了错误的模板。

我考虑过自己制作 ajax 请求扩展,但不确定要检查什么标头:

    public static bool IsAjaxOrFetchRequest(this HttpRequestBase request)
    
        if (request != null && request.Headers != null)
        
            if (request.Headers["Custom-Fetch-Header"] != null)
            
                return true;
            
        

        return request.IsAjaxRequest();
    

是否有一个 fetch 与 Request.Headers["X-Requested-With"] == "XMLHttpRequest" ajax 发送的所有请求一起发送的标头?

单步执行代码,我看不到任何突出的地方

【问题讨论】:

浏览器总是添加Origin请求头来获取跨域发送的请求和XHR请求。 @sideshowbarker 不幸的是他们来自同一个站点 【参考方案1】:

好吧,进一步研究一下,我似乎找不到任何随请求一起发送的标准标头,所以我创建了自己的标头:

const request = new Request(url, 
  headers: new Headers(
    'X-Is-Ajax-Request': 'True'
  )
);

return fetch(request)
  .then(html => 
    const $result = $(html);
    const $content = $result.filter('.js-sidebar-panel-content');
    return $content.length ? $content : $result;
  );

然后我可以更新我的扩展:

public static bool IsAjaxOrFetchRequest(this HttpRequestBase request)

    if (request != null && request.Headers != null)
    
        if (request.Headers["X-Is-Ajax-Request"] != null)
        
            return bool.Parse(request.Headers["X-Is-Ajax-Request"]);
        
    

    return request.IsAjaxRequest();

【讨论】:

这非常有效!但我很困惑,你为什么要费心更新扩展,而不是像其他框架发送的那样使用默认的 IsAjaxRequest() 扩展并发送 "X-Requested-With": "XMLHttpRequest"? 如果需要的话,我可以区分 ajax 请求和 fetch 请求 @Pete 在实践中出现过吗? "X-Requested-With": "Fetch" 会更好。 Kenneth 的解决方案是最好的,因为它不需要更改 C# 代码就可以使获取看起来像一个 ajax 请求。 Mat J 很好,因为它更好地符合实际发生的情况,并提供与告诉 c# 您正在使用什么方法访问它的一致性,但随后需要额外的编码来添加 IsFetchRequest 支持方法,然后将您的编码更新为 IsAjaxRequest | | IsFetchRequest... 将 X-Request-With 作为 XMLHttpRequest 传入要简单得多,并且只需要添加 fetch 选项即可使其按需要工作。

以上是关于扩展 IsAjaxRequest() 以包含获取 api 请求的主要内容,如果未能解决你的问题,请参考以下文章

Request.IsAjaxRequest 在 MVC3 中永远不会返回 true

c# – Asp.Net Core MVC中Request.IsAjaxRequest()在哪里?

如何从扩展语法检查中获取结果

如何获取包含背景图像以覆盖整个div? [重复]

如何在 Swift 中扩展 NSManagedObject 以包含 MKAnnotation?

通过 ActionLink 提交 Ajax.BeginForm