HttpRequestMessage.CreateResponse threw StackOverflowExcepti



我有一个函数应用程序。我写了一个单元测试项目(xunit(来测试我的函数应用程序代码。在单元测试方法中,我正在调用函数应用程序的Run方法。当请求为">Get"时,我的函数应用程序返回一个简单的json对象。虽然这在我的机器中运行良好,但在我同事的所有机器中,下面的行正在抛出StackOverFlowException。当我检查异常详细信息时,StackTrace为null。

request.CreateResponse(HttpStatusCode.OK, jObject)

在调试窗口中,我看到错误为">";在System.private.corlib.dll中发生未处理的异常">

功能应用程序:

public static async Task<HttpResponseMessage> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequestMessage req, ILogger log)
{
if (req.Method.Method.Equals(HttpMethod.Get.Method))
{
NameValueCollection queryString = System.Web.HttpUtility.ParseQueryString(req.RequestUri.Query);
operation = queryString.Get("operation");

if (operation == "GetVersion")
{
version = VersionHistory.GetVersion("ABC");// returns 
// {"ABC" : "2.1"}
return req.CreateResponse(HttpStatusCode.OK, version);  
//Above line causes StackOverFlowException
}
else
{
return 'Error message'
}
}
}

上面代码中的VersionHistory只是我正在使用的一个静态类。它只是返回一个json对象,类似于{{{quot;ABC":"0.1.2"}}。它与.net框架版本无关。

public static JObject GetVersion(string key)
{
// some logic. This logic is hit only once. I'm sure this is not 
// causing any exception
return JObject.Parse("{"" + key + "":"0.1.2"}");
}

单元测试:

public async Task Run_WhenGetRequest_ShouldReturnAppropriateFunctionAppVersion()
{
const string QUERYSTRING_KEY = "operation";
const string QUERYSTRING_VALUE = "GetVersion";
const string FUNCTION_APP_NAME = "ABC";
const string FUNCTION_APP_VERSION = "2.1";

_request.Method = HttpMethod.Get;
NameValueCollection queryList = HttpUtility.ParseQueryString(_request.RequestUri.Query);
if (queryList.Get(QUERYSTRING_KEY) == null)
{
string queryString = QueryHelpers.AddQueryString(_request.RequestUri.ToString(), QUERYSTRING_KEY, QUERYSTRING_VALUE);
_request.RequestUri = new System.Uri(queryString);
}

HttpResponseMessage response = await FunctionAppClassName.Run(_request, _logger);
// Assert code
}

我在Fixture类中构造了请求对象,如下所示,并模拟了Logger实例。

Request = new HttpRequestMessage
{
Content = new StringContent("", Encoding.UTF8, "application/json"),
RequestUri = new Uri("http://localhost/")
};

var services = new ServiceCollection().AddMvc().AddWebApiConventions().Services.BuildServiceProvider();

Request.Properties.Add(nameof(HttpContext), new DefaultHttpContext { RequestServices = services });

知道怎么解决这个问题吗?

我们终于找到了问题。问题是,当我们从测试用例中调用Http触发的函数应用程序时,它无法找到MediaType。在添加媒体类型作为回应后,如下图所示,它起了作用。

return req.CreateResponse(HttpStatusCode.OK, jObject, "application/json");

我仍然不确定为什么这个问题只出现在Visual Studio 2019 16.6.x和16.7.x中,而没有出现在16.4.x中。如果有人能对这个有所了解,我们将不胜感激

感谢那些给你时间的人。

相关内容

  • 没有找到相关文章

最新更新