Skip to main content
 首页 » 编程设计

c#之MVC 到 WebApi : Can a header be compressed

2024年05月10日39mq0036

我已经开始遇到一些问题,我的 header 超出了限制。

我有一个 MVC Controller ,调用 WebApi Controller /服务。

我知道触发器,它是一个我已转换为 base64 的 saml-token (xml)。 不,我无法控制 SecurityToken 服务……所以 JWT 目前不是一个选项。相信我,我已经多次提出我的担忧。 我们使用 saml 使用自定义委托(delegate)处理程序来保护 WebApi Controller ,该处理程序读取自定义 header 并将其转换为 ClaimPrincipal...

我看过处理响应的 gzip 代码示例,但经过数小时的谷歌搜索,我还没有找到是否有办法压缩我的自定义 header (如果这是唯一的方法,则全部压缩)...对于〜请求。

理想情况下我可以压缩

“X-我的自定义标题”

并在 webapi 端处理解压缩....

所以我不知道这是否可能。这是我第一次不得不处理过大的 header 问题。

下面的示例 MVC 代码。作为 FYI,Windows 凭据已发送,但其中包含运行运行 MVC 的 AppPool 的身份。 我的自定义 header 是与特定登录用户关联的 saml。因此,为什么我需要将其发送过来并与 windows-identity 分开考虑。

    using (var client = new HttpClient(HttpClientHandlerFactory.GetWindowsAuthenticationHttpClientHandler())) 
    { 
        client.DefaultRequestHeaders.Accept.Clear(); 
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
 
        string base64SerializedToken = "SuperDuperLongBase64String_IMeanSuperDuper"; 
        client.DefaultRequestHeaders.Add("X-My-Custom-Header", base64SerializedToken); 
 
        Uri baseUri = new Uri("http:www.mywebapiservice.com"); 
        Uri destinationUri = new Uri(baseUri, "doSomething"); 
        HttpResponseMessage response = client.PostAsJsonAsync(new Uri(new Uri(this._baseUri), destinationUri.ToString()).ToString(), accountName).Result; 
 
        if (response.IsSuccessStatusCode) 
        { 
            returnItem = response.Content.ReadAsAsync<MyCustomReturnObject>().Result; 
        } 
        else 
        { 
            string errorMessage = response.Content.ReadAsStringAsync().Result; 
            throw new InvalidOperationException(errorMessage); 
        } 
    }                
 
 
public static class HttpClientHandlerFactory 
{ 
    public static HttpClientHandler GetWindowsAuthenticationHttpClientHandler() 
    { 
        HttpClientHandler returnHandler = new HttpClientHandler() 
        { 
            UseDefaultCredentials = true, 
            PreAuthenticate = true 
        }; 
 
        return returnHandler; 
    } 
}        

请您参考如下方法:

考虑到 SAML token 的大小可能有几千字节,具体取决于声明的数量,将其作为 header 发送可能不是一个好主意。即使您现在可以让它工作,也不能保证它会在 claim 数量增加时继续工作。

由于 header 压缩没有标准,您将不得不修改对话的两端以对其进行处理。既然如此,为什么不简单地将 SAML token 添加为 API 中请求正文的一部分呢?

如果那真的行不通(我知道项目经理在遇到这样的事情时通常很痛苦)那么你将不得不考虑使用类似 GZipStream 的东西打包 XML,但在某些时候您仍然会遇到问题。这是创可贴,不是解决方案。