MVC 到 WebApi:可以压缩标头吗?



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

我有一个MVC控制器,调用WebApi控制器/服务。

我知道触发器,它是一个我已转换为 base64 的 saml 令牌 (xml)。不,我无法控制安全令牌服务...所以 JWT 目前不是一种选择。 相信我,我已经多次提出我的担忧。我们使用 saml 来保护 WebApi 控制器,使用自定义委派处理程序读取自定义标头并将其转换为声明主体...

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

理想情况下,我将能够压缩

"X-我的自定义标题"

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

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

下面的示例 MVC 代码。 仅供参考,窗口凭据被发送过来,但它包含运行运行MVC的应用程序池的身份。我的自定义标头是与特定登录用户关联的 saml。 因此,为什么我需要将其发送过来并将其与窗口标识分开考虑。

    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 令牌的大小可能为几千字节,具体取决于声明的数量,将其作为标头发送可能是一个坏主意。 即使你现在可以让它工作,也不能保证如果索赔计数增加,它还能继续工作。

由于没有标头压缩的标准,因此您必须修改会话的两端才能对此执行某些操作。既然如此,为什么不简单地将 SAML 令牌添加为 API 中的请求正文的一部分呢?

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

不,HTTP 中的标头压缩没有标准。这可能与您需要读取标头以了解标头是否(以及如何)压缩标头的事实有关。

如果你没有办法解压缩你在另一边发现的任何手动压缩,你就不走运了。

最新更新