Функция Azure выполняется локально, но не в Azure - PullRequest
0 голосов
/ 03 февраля 2019

Моя функция работает локально, но когда я публикую ее в Azure, происходит ошибка.

Ошибка:

Значение не может быть нулевым.Имя параметра: format

Похоже, поиск в Google позволяет предположить, что входные данные для функции неправильные, но я выкладываю точно такой же JSON, который позволяет выполнять его локально.

Я заблудился от того, как это исправить.Есть идеи?

Код ниже

using System;
using System.Configuration;
using System.Net;
using System.Net.Http;
using System.Security.Cryptography;
using System.ServiceModel.Description;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Xrm.Sdk.Query;
using Newtonsoft.Json;
using Microsoft.Extensions.Logging;



namespace MyFunction
{
    public static class Login
    {
        [FunctionName("Login")]
        public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequestMessage req, ILogger log)
        {
            Boolean websiteEnabled = false;
            Guid contactId = new Guid();
            log.LogInformation("C# HTTP trigger function processed a request.");
            dynamic data = await req.Content.ReadAsAsync<object>();
            string username = data?.username;
            string password = data?.password;
            string passwordHash = "";
            User user = new User();
            OrganizationServiceProxy _serviceProxy;
            IOrganizationService _service;
            ClientCredentials clientCredentials = new ClientCredentials();
            clientCredentials.UserName.UserName = ConfigurationManager.AppSettings["OrganisationUsername"];
            clientCredentials.UserName.Password = ConfigurationManager.AppSettings["OrganisationPassword"];
            Uri organisationUri = new Uri(String.Format(ConfigurationManager.AppSettings["OrganisationURL"]));
            Uri realm = new Uri(String.Format(ConfigurationManager.AppSettings["OrganisationURL"]));
            using (_serviceProxy = new OrganizationServiceProxy(organisationUri, realm, clientCredentials, null))
            {
                _serviceProxy.EnableProxyTypes();
                _service = (IOrganizationService)_serviceProxy;
                QueryByAttribute querybyattribute = new QueryByAttribute("contact");
                querybyattribute.ColumnSet = new ColumnSet("cbob_websitepassword","cbob_websiteenabled","contactid","fullname", "parentcustomerid");
                querybyattribute.Attributes.AddRange("emailaddress1");
                querybyattribute.Values.AddRange(username);
                EntityCollection retrieved = _service.RetrieveMultiple(querybyattribute);
                if(retrieved.Entities.Count == 1)
                {
                    passwordHash = retrieved.Entities[0].GetAttributeValue<String>("cbob_websitepassword");
                    websiteEnabled = retrieved.Entities[0].GetAttributeValue<Boolean>("cbob_websiteenabled");
                    contactId = retrieved.Entities[0].GetAttributeValue<Guid>("contactid");

                    user.Account = retrieved.Entities[0].GetAttributeValue<EntityReference>("parentcustomerid").Name.ToString();
                    user.Email = username;
                    user.LoggedInUser = retrieved.Entities[0].GetAttributeValue<String>("fullname");
                    user.AccountID = retrieved.Entities[0].GetAttributeValue<EntityReference>("parentcustomerid").Id.ToString();
                    user.BookingID = retrieved.Entities[0].Id.ToString();
                } else
                {
                    return req.CreateResponse(HttpStatusCode.BadRequest, "Not allowed");
                }


            }



            Boolean hash = bCryptHash(passwordHash, contactId.ToString() +  "-" + password);
            Console.WriteLine(hash);

            if (!websiteEnabled)
            {
                return req.CreateResponse(HttpStatusCode.BadRequest, "Not allowed");
            }

            if (hash)
            {
                string output = JsonConvert.SerializeObject(user).ToString();
                return req.CreateResponse(HttpStatusCode.OK, output);
            } else
            {
                return req.CreateResponse(HttpStatusCode.BadRequest, "Not allowed");
            }


        }

        public static Boolean bCryptHash(string hash, string submitted)
        {
            Boolean hashPassword = BCrypt.Net.BCrypt.Verify(submitted,hash);
            return hashPassword;
        }

        public static String sha256_hash(string value)
        {
            StringBuilder Sb = new StringBuilder();

            using (var hash = SHA256.Create())
            {
                Encoding enc = Encoding.UTF8;
                Byte[] result = hash.ComputeHash(enc.GetBytes(value));

                foreach (Byte b in result)
                    Sb.Append(b.ToString("x2"));
            }

            return Sb.ToString();
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Убедитесь, что вы добавили эти локальные настройки приложения (например, OrganisationUsername и т. Д. В файле local.settings.json) в настройки приложения.Найдите его на портале Azure, Функции платформы> Настройки приложения.Когда мы публикуем проект Function в Azure, по своему дизайну содержимое в local.settings.json не публикуется, потому что оно предназначено для локального разработчика.

Когда мы публикуем функции с VS, появляется дружественный диалог обновить настройки приложения.

enter image description here

0 голосов
/ 03 февраля 2019
Uri organisationUri = new Uri(String.Format(ConfigurationManager.AppSettings["OrganisationURL"]));
Uri realm = new Uri(String.Format(ConfigurationManager.AppSettings["OrganisationURL"]));

Я предполагаю, что одна или обе эти строки могут быть проблемой.Вы используете String.Format здесь, где первый параметр - это параметр format.AppSettings, который вы предоставляете для этого параметра, кажется недоступным.Убедитесь, что у вас есть эти значения конфигурации при развертывании вашей функции.

Дополнительно: если вы не предоставляете никаких объектов для String.Format, который вставляется в строку, почему вы вообще используете его?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...