У меня есть C# Программа нацеливания .NET Framework 4.7.2
и с типом вывода Консольное приложение. У меня есть файл Program.cs
в качестве основной точки входа, куда я временно перемещаю свой интеграционный тест с Azure функциями. Вызов Azure функций работает как положено в Program.cs
и показан ниже.
Исходный код функции Azure выглядит следующим образом :
#r "Newtonsoft.Json"
using System.Net;
using System.Text;
using System.Security.Cryptography;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
string name = req.Query["name"];
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
dynamic data = JsonConvert.DeserializeObject(requestBody);
name = name ?? data?.name;
return name != null
? (ActionResult)new OkObjectResult($"Hello, {name}")
: new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}
Теперь об ошибке.
Я использую тот же код, который вызывает Azure Функции в моих файлах Program.cs
и IntegrationTest.cs
, с немного отличающимися сигнатурами функций. Разница лишь в том, как я запускаю эти файлы. Для Program.cs
я установил точку останова и нажал ctrl+F5
, что привело меня к ожидаемому результату. Для IntegrationTest.cs
я помещаю курсор в функцию, которую я хочу протестировать, нажимаю ctrl+R
, затем ctrl+T
, чтобы отладить тест, и в итоге оказываюсь в блоке catch, показанном на скриншоте ниже.
Неожиданное поведение, которое я вижу и нуждаюсь в некоторой помощи в этом, находится в IntegrationTest.cs
, где я использую xUnit
для управления своим устройством и интеграции. При вызове функции Azure в IntegrationTest.cs
я получаю эту ошибку:
В обоих Program.cs
class Program
{
const string azureFunctionUrl = "https://cdscryptography.azurewebsites.net/api/HttpTrigger1";
static void Main(string[] args)
{
GetResponseFromAzureFunction();
}
static void GetResponseFromAzureFunction()
{
var httpWebRequest = (HttpWebRequest)WebRequest.Create(azureFunctionUrl);
httpWebRequest.ContentType = "application/json; charset=utf-8";
httpWebRequest.Method = "POST";
string json = "";
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
json = "{ \"name\" : \"Isabelle\"}";
streamWriter.Write(json);
streamWriter.Flush();
}
try {
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var responseText = streamReader.ReadToEnd();
Console.WriteLine(responseText);
}
} catch (WebException ex) {
Console.WriteLine(ex.Message);
}
Console.WriteLine("Nook");
}
}
В IntegrationTest.cs
[Fact]
public void GetResponseFromAzureFunction()
{
var httpWebRequest = (HttpWebRequest)WebRequest.Create(azureFunctionUrl);
httpWebRequest.ContentType = "application/json; charset=utf-8";
httpWebRequest.Method = "POST";
string json = "";
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
json = "{ \"name\" : \"Isabelle\"}";
streamWriter.Write(json);
streamWriter.Flush();
}
try {
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var responseText = streamReader.ReadToEnd();
Console.WriteLine(responseText);
}
} catch (WebException ex) {
Console.WriteLine(ex.Message);
}
Console.WriteLine("Nook");
}