C# 我如何在一个";azure功能“;
我有一个带有Http触发器的函数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请求) 我想嘲弄你。我已经设法这样
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是否是罪魁祸首。