Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.NetCore中禁用ModelBinder_C#_Asp.net Core_Model Binding_Asp.net Core Webapi - Fatal编程技术网

C# 在.NetCore中禁用ModelBinder

C# 在.NetCore中禁用ModelBinder,c#,asp.net-core,model-binding,asp.net-core-webapi,C#,Asp.net Core,Model Binding,Asp.net Core Webapi,海格斯 我正在从事一个WebApi项目,该项目接收来自客户端的请求,并将这些请求重定向到其他不开放直接访问的服务 默认情况下,.Net会自动序列化和反序列化Json请求参数,因此我需要在调用适当的服务之前重新序列化它们。在接收服务响应时也会出现同样的问题。我需要在将响应发送给用户之前对其进行反序列化;否则.Net framework将再次序列化它,导致“Json of Json”响应 我发现,但它似乎与.NetCore不起作用;所以我尝试创建自己的ModelBinder,它只读取Json对象并返

海格斯

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

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

我发现,但它似乎与.NetCore不起作用;所以我尝试创建自己的ModelBinder,它只读取Json对象并返回它

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

这段代码非常简单,这是我的第一次尝试,对于我来说效果很好。但是,当我获取第二个服务答案并返回给用户时,仍然会遇到“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;
        }
    }
}
//1。在操作中设置空参数列表,则不会调用序列化程序或模型绑定器。
公共异步任务代理操作(/*空参数列表*/)
{
var newUrl=@”https://stackoverflow.com";
var data=this.Request.Body;
使用(var client=new HttpClient())
{
//2.从输入流读取请求正文。
变量读取器=新的StreamReader(数据);
var json=reader.ReadToEnd();
使用(var content=newstringcontent(json))
{
//3.设置正确的内容类型
content.Headers.ContentType=new System.Net.Http.Headers.MediaTypeHeaderValue(this.Request.ContentType);
//4.向内部服务部门提交请求
var response=wait client.PostAsync(newUrl,content);
//5.读取响应而不进行反序列化
var innerResponse=await response.Content.ReadAsStringAsync();
var contentType=response.Content.Headers.contentType.ToString();
var statusCode=response.statusCode;
//6.返回内部响应而不序列化
var outerResponse=this.Content(innerResponse,contentType);
outerResponse.StatusCode=(int)StatusCode;
返回外部响应;
}
}
}
//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;
        }
    }
}