Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.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# 我如何在一个";azure功能“;_C#_Json_Asp.net Core_Mocking_Azure Functions - Fatal编程技术网

C# 我如何在一个";azure功能“;

C# 我如何在一个";azure功能“;,c#,json,asp.net-core,mocking,azure-functions,C#,Json,Asp.net Core,Mocking,Azure Functions,我有一个带有Http触发器的函数 public async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function,"post", Route = null)] HttpRequest req) 公共异步任务运行([HttpTrigger(AuthorizationLevel.Function,“post”,Route=null)]HttpRequest请求) 我想嘲弄你。我已经设法这样

我有一个带有Http触发器的函数

public async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function,"post", Route = null)] HttpRequest req)
公共异步任务运行([HttpTrigger(AuthorizationLevel.Function,“post”,Route=null)]HttpRequest请求)
我想嘲弄你。我已经设法这样做了

private static Mock<HttpRequest> CreateMockRequest(object body)
{            
    using var memoryStream= new MemoryStream();
    using var writer = new StreamWriter(memoryStream);
 
    var json = JsonConvert.SerializeObject(body);
 
    writer .Write(json);
    writer .Flush();
 
    memoryStream.Position = 0;
 
    var mockRequest = new Mock<HttpRequest>();
    mockRequest.Setup(x => x.Body).Returns(memoryStream);
    mockRequest.Setup(x => x.ContentType).Returns("application/json");

    return mockRequest;
}
private static Mock CreateMockRequest(对象体)
{            
使用var memoryStream=new memoryStream();
使用var writer=newstreamwriter(memoryStream);
var json=JsonConvert.SerializeObject(主体);
Write.Write(json);
writer.Flush();
memoryStream.Position=0;
var mockRequest=new Mock();
mockRequest.Setup(x=>x.Body).Returns(memoryStream);
Setup(x=>x.ContentType).Returns(“application/json”);
返回请求;
}
主体,在上面的代码中只是一些json。然后,我使用这段代码反序列化这段代码,并将json填充到mockRequest的主体中

public static async Task<HttpResponseBody<T>> GetBodyAsync<T>(this HttpRequest req)
    using var stream = new StreamReader(req.Body);
    var bodyString = await stream.ReadToEndAsync();
...
}
公共静态异步任务GetBodyAsync(此HttpRequest请求)
使用var stream=新的StreamReader(请求正文);
var bodyString=wait stream.ReadToEndAsync();
...
}
bodyString在这里不是有效的json,因为json中似乎有引号转义,例如。 原始Json=
{“x”:“somexvalue”}
返回的值=
{\“x\”:\“somexvalue\”

在您说这只是visual studio debug inspector之前,它不是。我已经检查过了。似乎
StreamWriter
正在这样做,或者
StreamReader
正在这样做


显而易见的解决方案是从生成的json中去掉\n,但这感觉非常错误,而且工作起来很混乱。有没有一种方法可以在不改变我的函数的情况下解决这个问题。

因此,问题在于
StreamWriter
。解决方法就是不要使用
StreamWriter
@ColinM。这是正确的模仿身体的方法

    var json = JsonConvert.SerializeObject(body);

    var memoryStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(json));

    var context = new DefaultHttpContext();
    var request = context.Request;
    request.Body = memoryStream;
    request.ContentType = "application/json";

    return request;

由于
“application\json”
,我预计该代码无法用编译,因为它既不使用“\\”或者@带引号的字符串文字格式。@YegorAndrosov我已经读过了。伪HttpRequest只用于查询字符串。文档中与正文无关,它显示对请求的访问。是的,它只显示查询,但正文存储在
上下文中。request.body
,向它写入任何流。@YegorAndrosov这正是有趣的是,我实际上删除了我的评论,因为我在这两种情况下都测试了代码,它对我来说都很好。所以我不确定StreamWriter是否是罪魁祸首。