Внутренняя ошибка 500 Произошла ошибка на портале Azure, но локально она работает нормально - PullRequest
2 голосов
/ 24 мая 2019

У меня есть функция Azure, которая принимает некоторые параметры и создает запрос к другому API. В локальной Visual Studio он работает нормально, но не работает на портале Azure, хотя код тот же.

Я проверил весь код на локальном портале и портале Azure, но не понимаю, что я делаю неправильно. Вот мой фрагмент кода.

using System.Net;
using Newtonsoft.Json;
using System.Net.Http;
using System.Linq;
using System.Collections.Generic;


public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");
    try
    {
        // Convert all request perameter into Json object

        var content = req.Content;
        string jsonContent = content.ReadAsStringAsync().Result;
        dynamic requestPram = JsonConvert.DeserializeObject<CaseRequestModel>(jsonContent);


        // Validate required param

        if (string.IsNullOrEmpty(requestPram.email.Trim()))
        {
            return req.CreateResponse(HttpStatusCode.OK, "email required!");
        }


        //Create API request

        HttpClient client = new HttpClient();


        //Partner contact class
        Contact objContactModel = new Contact();

        //Call Contact API by Email
        HttpRequestMessage newRequest = new HttpRequestMessage(HttpMethod.Get, string.Format("https://APIURL/api/ConnectUs/GetPartnerContacts?email={0}", requestPram.email.Trim()));
        HttpResponseMessage response = await client.SendAsync(newRequest);

        List<Contact> listPartnerContact = new List<Contact>();

        //Read Server Response
        listPartnerContact = await response.Content.ReadAsAsync<List<Contact>>();

        if (listPartnerContact == null)
        {
            return req.CreateResponse(HttpStatusCode.OK, "No Partner found!");
        }

        //Filter one record for binding class for Request Case

        var filterCasePartnerClass = listPartnerContact.FirstOrDefault();

        if (filterCasePartnerClass == null)
        {
            return req.CreateResponse(HttpStatusCode.OK, "No Partner found!");
        }
        // Instancify PartnerCaseApiRequestModel class for submitting Case Request

        CaseApiRequestModel caseRequestModel = new CaseApiRequestModel();

        caseRequestModel.serviceCatalog = Guid.NewGuid();
        caseRequestModel.dispatchToTeam = Guid.NewGuid();
        caseRequestModel.title = requestPram.title;
        caseRequestModel.description = requestPram.description;
        caseRequestModel.contact = filterCasePartnerClass;

        // Post data to Partner Case Request API
        // Convert json
        string routingActivityId = null;
        var json = JsonConvert.SerializeObject(caseRequestModel);
        var stringContent = new StringContent(json, UnicodeEncoding.UTF8, "application/json");

        try
        {
            HttpResponseMessage responseFromCaseApi = await client.PostAsync("MyURL", stringContent);

            if (responseFromCaseApi.IsSuccessStatusCode)
            {
                routingActivityId = responseFromCaseApi.Content.ReadAsStringAsync().Result;
            }
        }
        catch (Exception ex)
        {
            Console.Error.WriteLine(ex.Message);
        }


        return req.CreateResponse(HttpStatusCode.OK, new CaseResponseModel { CaseRequestId = routingActivityId });
    }
    catch (Exception ex)
    {

        Console.Error.WriteLine(ex.Message);
        return req.CreateResponse(HttpStatusCode.OK, "");
    }
}
public class CaseResponseModel
{
    public string CaseRequestId { get; set; }
}
public class Contact
{
    public string contactId { get; set; }
    public string mpnID { get; set; }
    public string partnerName { get; set; }
    public string contract { get; set; }
    public DateTime enrollmentEndDate { get; set; }
    public string advisoryHours { get; set; }
    public string fieldMotion { get; set; }
    public string firstName { get; set; }
    public string lastName { get; set; }
    public string phoneNumber { get; set; }
    public string email { get; set; }
    public int contactLanguageCode { get; set; }
}
public class CaseRequestModel
{

    public string email { get; set; }
    public string title { get; set; }
    public string description { get; set; }

}
public class CaseApiRequestModel
{
    public Guid serviceCatalog { get; set; }
    public Guid dispatchToTeam { get; set; }
    public string title { get; set; }
    public string description { get; set; }
    public Contact contact { get; set; }
}

1 Ответ

2 голосов
/ 24 мая 2019

Кажется, вы пытаетесь реализовать свою локальную функцию на azure portal.

В вашем случае весь код выглядит нормально.Но локальная визуальная студийная функция и azure portal мало изменилась.

Не забудьте добавить эту ссылку ниже при переходе на azure portal

#r "Newtonsoft.Json"

Вы также пропустили следующую ссылку:

using System.Text;

Поскольку вы используете

 var stringContent = new StringContent(json, UnicodeEncoding.UTF8, "application/json");

Требуется указанная выше ссылка.

Передовая практика при переносе локальной функции на портал Azure

1.Не копируйте и не вставляйте полный код с локального на Azure portal

2.Передайте небольшой кусок кода и Save & Run

3.Если каждый блок работает хорошо, переходите к следующему фрагменту

4.Не добавляйте файл класса как .csx, сначала добавьте класс под функцией, как только он будет работать нормально, а затем добавьте как .csx в разделе файла

5.Будьте осторожны с местными ссылками на Azure portal

6.Вышеуказанная практика определенно снизила вашу частоту появления ошибок.

Примечание: Local visual studio function и Azure portal имеют небольшую разницу. Сначала лучше создать новую функцию.Последнее может быть улучшено в соответствии с вашими потребностями, что может уменьшить количество ошибок.

Если у вас еще есть какие-либо вопросы, вы можете поделиться ими в комментарии.Спасибо и счастливого кодирования!

...