c# - 如何在“天蓝色函数”上模拟 HttpRequest
问题描述
我有一个带有 Http 触发器的函数
public async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function,"post", Route = null)] HttpRequest req)
我想模拟请求。我已经设法做到了,就像这样
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;
}
body,在上面的代码中只是一些 json. 然后我使用这段代码反序列化填充在 mockRequest 主体中的 json
public static async Task<HttpResponseBody<T>> GetBodyAsync<T>(this HttpRequest req)
using var stream = new StreamReader(req.Body);
var bodyString = await stream.ReadToEndAsync();
...
}
bodyString 在这里不是有效的 json,因为 json 中的引号似乎被转义了,例如 Original Json ={"x": "somexvalue"}
返回的值 ={\"x\": \"somexvalue\"
在你说这只是 Visual Studio 调试检查器之前,它不是。我检查过。似乎StreamWriter
正在这样做或正在这样做StreamReader
。
显而易见的解决方案是从生成的 json 中删除 \ ,但这感觉非常错误并且工作范围很广。有没有办法解决这个问题而不必改变我的功能。
解决方案
所以,问题出在StreamWritter
. 解决方法就是不使用StreamWritter
. @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;
推荐阅读
- django - django admin 字段和表单的顺序
- flutter - Flutter Widget 生命周期和 Providers
- pyspark - 如何使用 pyspark.sql.session.SparkSession 对象读取 .dat 文件
- c++ - 每次在 Visual Studio 中运行代码时,如何运行可执行文件?
- scikit-learn - Sklearn Pipeline 设置详细属性
- image - 如何在不模糊儿童 Flutter 的情况下模糊 Container 中的图像?
- python - if 语句内的 capitalize() 方法,字典中的 for 循环内
- c++ - Runge Kutta diff eq 求解器中的堆损坏和奇怪的断点
- c# - 根据组中另一列的值更新数据表列
- ffmpeg - ffmpeg - 基于颜色的区域条件模糊