.NET MVC 兼容不支持 PUT/DELETE 的瀏覽器

  • 前端:ASP.NET MVC
  • 后端:.NET WebAPI

在系統(tǒng)中萧锉,老是有客戶抱怨珊随,某某地方修改不了啊述寡、某某記錄刪不掉啊、……

經(jīng)過(guò) N 次測(cè)試叶洞,發(fā)現(xiàn)問(wèn)題主要集中在 Restful 的 PUT 或 DELETE 請(qǐng)求的時(shí)候鲫凶。

但是 Chrome 貌似全部功能都是可用的,看來(lái)衩辟,是瀏覽器支持的問(wèn)題螟炫,簡(jiǎn)單記錄一下解決方法吧,懶得去統(tǒng)計(jì)哪些瀏覽器不支持了艺晴。

先說(shuō)一句昼钻,如果是 Java 的童鞋,如果使用的是 SpringMVC封寞,那恭喜你了然评,該框架已經(jīng)帶了該兼容方法的支持了,具體的狈究,可以自行百度碗淌,也可以看這里

方案:客戶端統(tǒng)一 POST 提交抖锥,API 端重寫 HTTP Method

首先亿眠,繼承 DelegatingHandler,重寫方法磅废,代碼如下:

using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;

namespace Test.Web
{
    /// <summary>
    /// 兼容不支持 PUT/DELETE 方法的瀏覽器
    /// </summary>
    public class TestHTTPHandler : DelegatingHandler
    {
        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            IEnumerable<string> methods;

            // 在 ajax 的 header 中添加 _method 標(biāo)記纳像,標(biāo)明真實(shí)的請(qǐng)求方法
            // 如果沒(méi)有該標(biāo)記或?yàn)榭眨褪褂迷镜恼?qǐng)求方法
            if (request.Headers.TryGetValues("_method", out methods))
            {
                var method = methods.First();

                if (!string.IsNullOrWhiteSpace(method))
                {
                    request.Method = new HttpMethod(method);
                }
            }

            return base.SendAsync(request, cancellationToken);
        }
    }
}

然后拯勉,在 Global.asax 中竟趾,注冊(cè)該方法,代碼如下:

// …… 其它 using
using System.Web.Http;

void Application_Start(object sender, EventArgs e)
{
    // …… 其它代碼 ……

    // 兼容不支持 PUT/DELETE 方法的瀏覽器
    GlobalConfiguration.Configuration.MessageHandlers.Add(new TestHTTPHandler());
}

最后谜喊,在 Javascript 中潭兽,發(fā)送 ajax 請(qǐng)求如下(以 jQuery 為例):

// POST 請(qǐng)求
$.post('http://api.xxxx.com/xxxx', data, function (result) {
    // 業(yè)務(wù)處理邏輯
});

// PUT 請(qǐng)求
$.ajax({
    url: 'http://api.xxxx.com/xxxx',
    type: 'POST',   // 統(tǒng)一 POST 請(qǐng)求
    headers: { _method: 'PUT' },   // 標(biāo)明真實(shí)的 PUT 方法
    data: data,
    success: function (result) {
        // 業(yè)務(wù)處理邏輯
    }
});

// DELETE 請(qǐng)求
$.ajax({
    url: 'http://api.xxxx.com/xxxx/{id}',
    type: 'POST',   // 統(tǒng)一 POST 請(qǐng)求
    headers: { _method: 'DELETE' },   // 標(biāo)明真實(shí)的 DELETE 方法
    success: function (result) {
        // 業(yè)務(wù)處理邏輯
    }
});

至此,全部功能實(shí)現(xiàn)完畢斗遏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末山卦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌账蓉,老刑警劉巖枚碗,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異铸本,居然都是意外死亡肮雨,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門箱玷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)怨规,“玉大人,你說(shuō)我怎么就攤上這事锡足〔ǚ幔” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵舶得,是天一觀的道長(zhǎng)掰烟。 經(jīng)常有香客問(wèn)我,道長(zhǎng)沐批,這世上最難降的妖魔是什么纫骑? 我笑而不...
    開(kāi)封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮九孩,結(jié)果婚禮上先馆,老公的妹妹穿的比我還像新娘。我一直安慰自己捻撑,他們只是感情好磨隘,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著顾患,像睡著了一般番捂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上江解,一...
    開(kāi)封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天设预,我揣著相機(jī)與錄音,去河邊找鬼犁河。 笑死鳖枕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的桨螺。 我是一名探鬼主播宾符,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼灭翔!你這毒婦竟也來(lái)了魏烫?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哄褒,沒(méi)想到半個(gè)月后稀蟋,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體估盘,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瓣赂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年点寥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了楚殿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡淆储,死狀恐怖潭千,靈堂內(nèi)的尸體忽然破棺而出缓窜,到底是詐尸還是另有隱情管闷,我是刑警寧澤粥脚,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布窃肠,位于F島的核電站包个,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏冤留。R本人自食惡果不足惜碧囊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纤怒。 院中可真熱鬧糯而,春花似錦、人聲如沸泊窘。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)烘豹。三九已至瓜贾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間携悯,已是汗流浹背祭芦。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留憔鬼,地道東北人龟劲。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像轴或,于是被迫代替她去往敵國(guó)和親昌跌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容