我正在寻找一种方法来使用以下字符串预先添加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等。
有什么建议吗?
答案 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管道包含的内容:
有关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;
}
}