c# - MVC 到 WebApi : Can a header be compressed?

标签 c# asp.net-mvc asp.net-mvc-4 asp.net-web-api

我已经开始遇到一些问题,我的 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,但在某些时候您仍然会遇到问题。这是创可贴,不是解决方案。

关于c# - MVC 到 WebApi : Can a header be compressed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34948980/

相关文章:

c# - 单声道中的并行 LINQ 实现?

ajax - .Net MVC 部分 View 在 session 过期时加载登录页面

c# - 重新发送模型会重置 asp.net mvc 中的值吗?

asp.net-mvc-4 - 首先使用 ef 代码更新复杂类型

asp.net-mvc - MVC 4 路由无法正确读取 URL

c# - 带有 api key 身份验证的 Swagger 客户端生成

c# - 如何用等效的符号替换网页代码?

c# - .NET Remoting 异常未在客户端处理

asp.net - 表单例份验证 - 滑动过期

c# - 添加分离实体时延迟加载不起作用