Нет определения для GetQueryNameValuePairs в функции Azure - PullRequest
0 голосов
/ 14 ноября 2018

Все, Я работаю над своей первой функцией Azure. Цель этой функции - взять текст и проверить орфографию с помощью когнитивного API Bing. Тем не менее, я не могу скомпилировать, потому что в строке text = req.GetQueryNameValuePairs () ... в моем коде, потому что в нем указано, что HTTPRequestMessage не содержит определения для GetQueryNameValuePairs и нет метода расширения GetQueryNameValuePairs, принимающего первый аргумент может быть найден тип 'HttpRequestMessage' (отсутствует директива using или ссылка на сборку?).

Любая помощь будет оценена.

using System.IO;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Azure.WebJobs.Host;
using Newtonsoft.Json;
using System.Net;
using System;
using System.Net.Http;
using System.Linq;
using System.Collections.Generic;
using System.Net.Http.Headers;
using System.Threading.Tasks;

namespace SpellCheck.Functions
{
    public static class SpellCheck
    {
        [FunctionName("SpellCheck")]
        //public async static Task Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequest req, TraceWriter log)
        public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log)
        {
            log.Info("C# HTTP trigger function processed a request.");

            //List<KeyValuePair<string, string>> values = new List<KeyValuePair<string, string>>();
            //values.Add(new KeyValuePair<string, string>("text", text));

            //error here
            string text = req.GetQueryNameValuePairs()
                .FirstOrDefault(q => string.Compare(q.Key, "text", true) == 0)
                .Value;

            dynamic data = await req.Content.ReadAsAsync<object>();
            text = text ?? data?.text;

            // Replace the accessKey string value with your valid access key. - https://www.codeproject.com/Articles/1221350/Getting-Started-with-the-Bing-Search-APIs
            const string accessKey = "MY_ACCESS_KEY_GOES_HERE";

            HttpClient client = new HttpClient();
            client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", accessKey);

            //  The endpoint URI.
            const string uriBase = "https://api.cognitive.microsoft.com/bing/v7.0/spellcheck?";
            const string uriMktAndMode = "mkt=en-US&mode=proof&";

            HttpResponseMessage response = new HttpResponseMessage();
            string uri = uriBase + uriMktAndMode;

            List<KeyValuePair<string, string>> values = new List<KeyValuePair<string, string>>();
            values.Add(new KeyValuePair<string, string>("text", text));

            using (FormUrlEncodedContent content = new FormUrlEncodedContent(values))
            {
                content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
                response = await client.PostAsync(uri, content);
            }

           string client_id;
            if (response.Headers.TryGetValues("X-MSEdge-ClientID", out IEnumerable<string> header_values))
            {
                client_id = header_values.First();
            }

            string contentString = await response.Content.ReadAsStringAsync();

            return text == null
                ? req.CreateResponse(HttpStatusCode.BadRequest, "Please pass text on the query string or in the request body")
                : req.CreateResponse(HttpStatusCode.OK, "Text to Spell: " + text);    
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

Если у вас есть параметры запроса: имя и фамилия , то вы можете попробовать это:

    var qs = System.Web.HttpUtility.ParseQueryString(req.RequestUri.Query);

    string firstName = qs.Get("firstname");
    string lastName = qs.Get("lastname");
0 голосов
/ 14 ноября 2018

Похоже, вы создали функцию Azure v2 (.Net Core). В сборке .Net Core / Standard такого метода GetQueryNameValuePairs на HttpRequestMessage нет, он доступен в .Net Framework.

Быстрое исправление - создание функционального проекта v1 (.NetFramework). Если вы хотите остаться с функцией v2, необходим рефакторинг кода.

В шаблоне httptrigger v2 вы можете увидеть HttpRequest req (в вашем сером комментарии), и он использует req.Query["name"] для получения параметра запроса. Есть несколько других необходимых изменений, так как мы изменили HttpRequestMessage на HttpRequest. Кроме того, TraceWriter в v1 также заброшен, в v2 мы используем ILogger.

...