Вызов функции Http Triggered azure в консольном приложении. NET core c# - PullRequest
0 голосов
/ 06 марта 2020

У меня есть функция Node Http, запускаемая azure, которая возвращает массив в теле ответа. Я хочу вызвать эту функцию внутри консольного приложения C# и получить доступ к массиву, возвращенному функцией azure. Моя функция azure возвращает ожидаемое тело ответа, когда я нажимаю его на почтальона. Однако это не тот случай, когда я вызываю эту конечную точку в приложении c#, поскольку я получаю объект ответа со статусом 200, но длина содержимого равна -1. Обратите внимание: если я выполняю тот же вызов для обычного приложения express в приложении c#, я могу получить ожидаемый ответ

Вот моя azure функция

    const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {

    context.log('HTTP trigger function processed a request.');
    const adresses = req.body && req.body.adresses;

    if (adresses) {

        //make an asyn function call
        const locationsPromise = await adresses.map(async (address) => await getLocationCoordinates(address));
        const resolvedLocations = await Promise.all(locationsPromise);
        context.res = await {
            // status: 200, /* Defaults to 200 */
            body:{ data: resolvedLocations}
        };
    }
    else {
        context.res = await  {
            status: 400,
            body: "Please pass a adresses in the request body"
        };
    }
};

Вот мой C# код, который я использую для звонка

  {
    string[] adresses = new string[] { "nairobi", "nakuru", "kericho" };
    string apiUrl = "http://localhost:7071/api/Adress-call";
    Dictionary<string, string[]> postData1 = new Dictionary<string, string[]>()
    {
        { "adresses", adresses },

    };

    var postData = JsonConvert.SerializeObject(postData1);
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(apiUrl);
    request.Method = "POST";
    request.ContentType = "application/json";
    request.ContentLength = postData.Length;
    using (Stream webStream = request.GetRequestStream())
    using (StreamWriter requestWriter = new StreamWriter(webStream, Encoding.ASCII))
    {
        requestWriter.Write(postData);
    }
    try
    {
        WebResponse response = request.GetResponse();
        using (Stream responseStream = response.GetResponseStream())
        {
            StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
            DataTable ds = new DataTable();
            var pageViewModel = JsonConvert.DeserializeObject<List<LocationModel>>(reader.ReadToEnd());

        }
    }
    catch (WebException ex)
    {
        WebResponse errorResponse = ex.Response;
        using (Stream responseStream = errorResponse.GetResponseStream())
        {
            StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
            String errorText = reader.ReadToEnd();
            // log errorText
        }
        throw;
    }


}

1 Ответ

0 голосов
/ 06 марта 2020

Content-Header может отсутствовать в ответе. Если вы проверите HttpWebResponse.ContentLength , вы получите -1. Как объясняют документы:

Если заголовок Content-Length не установлен в ответе, ContentLength устанавливается в значение -1. ​​

HttpWebRequest и HttpWebResponse действительно старые классы, которые в значительной степени заменены HttpClient, особенно in. NET Core. При создании этих классов не было типов значений, допускающих обнуляемость, поэтому они могут возвращать только -1.

. Все это следует заменить на HttpClient. Код не просто проще, сам класс является поточно-ориентированным и может быть использован повторно. Он кеширует сокетов, что означает, что приложению не нужно платить налог на разрешение DNS каждый раз, когда оно пытается вызвать одну и ту же конечную точку:

var data=new { adresses = new [] { "nairobi", "nakuru", "kericho" }};
var postData = JsonConvert.SerializeObject(data);
var content=new StringContent(data,Encoding.UTF8,"application/json");

var response=await client.PostAsync(content);

На этом этапе вы можете проверить код состояния:

if (response.StatusCode == ...) // Check status code here.
{
 ...
}

Content-Length является заголовком Content . Может отсутствовать, и в этом случае свойство ContentLength будет иметь значение null:

if (response.Content.Headers.ContentLength!=null)
{
    long length=response.Content.Headers.ContentLength.Value;
    //Use the Content length here
}

Или, используя сопоставление с образцом:

if (response.Content.Headers.ContentLength is long length)
{    
    //Use the Content length here
}

Наконец, вы можете прочитать ответ как строка с ReadAsStringAsync и десериализация. Этот метод позаботится о декодировании тела ответа:

var json=await response.Content.ReadAsStringAsync();
var models=JsonConvert.DeserializeObject<List<LocationModel>>(json);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...