.net webapi操纵响应(前置对象带有“)]}',\ n”)

时间:2015-09-08 06:23:19

标签: c# json asp.net-mvc asp.net-web-api

我正在寻找一种方法来使用以下字符串预先添加Web API 2响应 )]}',\n

你可能知道为什么。这是JSON劫持保护。我有.Net MVC常规控制器的解决方案,但没有Web API的解决方案。

在MCVC中,我有一个特殊的JsonNetResponse对象,我可以在其中执行以下操作:

var serializedObject = JsonConvert.SerializeObject(Data, Formatting.None);
response.Write(")]}',\n");
response.Write(serializedObject);

我不知道在执行动作后我可以在哪里操纵响应。 也许我对Web API请求生命周期知之甚少。我会尝试更多地搜索。

我想为所有类型的请求执行此操作:POST,GET,PUT等。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您正在寻找的是DelegatingHandler。您可以派生它以挂钩Web API管道并覆盖其SendAsync方法:

public class JsonProtector : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(
                HttpRequestMessage request, CancellationToken cancellationToken)
    {
        HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
        // Manipulate response here.
        return response;
    }
}

对于一般知识,这是Web API管道包含的内容:

Web API pipeline

有关here

的更多信息

答案 1 :(得分:0)

好吧,因为@Yuval Itzchakov sugested解决方案是扩展DelegatingHandler。 这是完整的代码:

public class JsonProtector : DelegatingHandler
{
    protected async override Task<HttpResponseMessage> SendAsync(
                HttpRequestMessage request, CancellationToken cancellationToken)
    {
        HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
        // Manipulate response here.
        if(response.StatusCode == System.Net.HttpStatusCode.OK)
        {
            string responseData = await response.Content.ReadAsStringAsync();
            responseData = ")]}',\n" + responseData;
            var repo = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(responseData));
            response.Content = new StreamContent(repo);
        }
        return response;
    }
}