gpt4 book ai didi

c# - 在 .Net Core 中禁用模型绑定(bind)器

转载 作者:太空宇宙 更新时间:2023-11-03 15:03:13 27 4
gpt4 key购买 nike

大家好

我正在开发一个 WebApi 项目,该项目接收来自客户端的请求并将这些请求重定向到其他未开放直接访问的服务。

默认情况下,.Net 会自动序列化和反序列化 Json 请求参数,因此我需要在调用相应服务之前重新序列化它们。接收服务响应时也会出现同样的问题。在将响应发送给用户之前,我需要反序列化它;否则 .Net 框架将再次序列化它,导致“Json of Json”响应。

我找到了 this answer但它似乎不适用于 .NetCore;所以我尝试创建自己的 ModelBinder,它只读取 Json 对象并返回它。

class JsonUnformatterBinderProvider : Microsoft.AspNetCore.Mvc.ModelBinding.IModelBinderProvider
{
public IModelBinder GetBinder(ModelBinderProviderContext context)
{
return new JsonUnformatterBinder(new SimpleTypeModelBinder(context.Metadata.ModelType));
}
}

class JsonUnformatterBinder : IModelBinder
{
private readonly IModelBinder _fallbackBinder;

public JsonUnformatterBinder(IModelBinder fallbackBinder)
{
_fallbackBinder = fallbackBinder;
}

public Task BindModelAsync(ModelBindingContext bindingContext)
{
string currMethod = bindingContext.ActionContext.HttpContext.Request.Method;

if ("POST".Equals(currMethod) || "PUT".Equals(currMethod))
{
string strData = new StreamReader(bindingContext.ActionContext.HttpContext.Request.Body).ReadToEnd();
bindingContext.Result = ModelBindingResult.Success(strData);
return Task.CompletedTask;
}

return _fallbackBinder.BindModelAsync(bindingContext);
}
}

这段代码非常简单,这是我的第一次尝试,它对我的​​目的来说效果很好。但是,当我获取第二个服务答案并返回给用户时,我仍然遇到“Json of Json”问题。

我基本上不知道我能做些什么来克服这个问题,所以这里欢迎任何解决方法。

最佳答案

如果您只需要重定向一个请求而无需修改,您可以直接从输入流中读取它并将它发送到内部服务。您也可以使用这种方法来读取内部服务的响应。

//1. Set empty parameter list in action then neither serializator nor model binder are not invoked.
public async Task<ContentResult> ProxyAction(/*empty parameter list*/)
{
var newUrl = @"https://stackoverflow.com";
var data = this.Request.Body;

using (var client = new HttpClient())
{
//2. Read request body from input stream.
var reader = new StreamReader(data);
var json = reader.ReadToEnd();

using (var content = new StringContent(json))
{
//3. Set correct content type
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(this.Request.ContentType);

//4. Post request to inner service
var response = await client.PostAsync(newUrl, content);

//5. Read response without deserialization
var innerResponse = await response.Content.ReadAsStringAsync();
var contentType = response.Content.Headers.ContentType.ToString();
var statusCode = response.StatusCode;

//6. Return inner response without serialization
var outerResponse = this.Content(innerResponse, contentType);
outerResponse.StatusCode = (int)statusCode;
return outerResponse;
}
}
}

关于c# - 在 .Net Core 中禁用模型绑定(bind)器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45059853/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com