asp.net webservice處理gzip壓縮請求
我編寫了一個 asp.net .asmx webservice 來處理來自第三方工具的請求。第三方工具向 Web 服務發出 http POST 請求以獲取使用者資訊。我正在使用 IIS7
在選中“刪除所有編碼”的情況下執行 Fiddler,我可以看到 web 服務呼叫並且一切正常。如果我取消選中“刪除所有編碼”,則 Web 服務呼叫將失敗並顯示 400 錯誤請求。我看到的不同之處在於 Fiddler 正在刪除標題“Content-Encoding:gzip”並且正在解壓縮內容。
因此,當移除 Content-Encoding 標頭並解壓縮內容時,我的 Web 服務執行良好。當標頭存在並且內容被壓縮時,Web 服務將失敗。
我怎麼能:
- 配置我的網路服務以告訴客戶端它不會接受壓縮請求(並希望第三方工具尊重這一點)
- 在 asp.net 處理的早期解壓內容
- 修改我的網路服務以使用壓縮數據
更新:需要明確的是,我不需要在響應中配置 gzip 編碼,我需要處理對我的 web 服務的 gzip 編碼請求。
更新 2:第三方工具是 Salesforce.com Outlook 外掛。因此,我無權對其進行修改,並且許多其他公司都在使用它而不會遇到麻煩。這一定是我正在做(或不做)的事情
更新 3 :我在這裡發現一篇文章說 IIS 不支持帶有壓縮數據的傳入 POST 請求,它只支持壓縮響應。這仍然是真的嗎?
最簡單的技術是創建一個
HttpModule替換請求過濾器的方法。它更具可重用性,並且避免了 Global.asax。也不需要創建一個新的解壓縮流類,因為它GZipStream已經準備好了。這是完整的程式碼,它也刪除了Content-Encoding: gzip不再需要的程式碼:public class GZipRequestDecompressingModule : IHttpModule { public void Init(HttpApplication context) { context.BeginRequest += (sender, e) => { var request = (sender as HttpApplication).Request; string contentEncoding = request.Headers["Content-Encoding"]; if (string.Equals(contentEncoding, "gzip", StringComparison.OrdinalIgnoreCase)) { request.Filter = new GZipStream(request.Filter, CompressionMode.Decompress); request.Headers.Remove("Content-Encoding"); } }; } public void Dispose() { } }要啟動此模組,請將以下部分添加到您的 web.config 中:
<system.webServer> <modules runAllManagedModulesForAllRequests="true"> <add name="AnyUniqueName" type="YourNamespace.GZipRequestDecompressingModule, YourAssembly" preCondition="integratedMode" /> </modules> </system.webServer>
由於第 3 方服務只是向您發送 POST,我認為不可能告訴他們不要發送壓縮文件。
您可以嘗試覆蓋 GetWebRequest 並在途中解壓縮它
public partial class MyWebService : System.Web.Services.Protocols.SoapHttpClientProtocol { protected override WebRequest GetWebRequest(Uri uri) { base.GetWebRequest(uri);request.AutomaticDecompression = System.Net.DecompressionMethods.GZip; return request; } }