Следующее работает в разработке на локальном хосте, но в производстве не - PullRequest
0 голосов
/ 11 июля 2019

Я создал класс, у которого есть таймер, который вызывает функцию, созданную в моей учетной записи Azure, для возврата состояния Azure, возвращаемое значение кэшируется.В классе у меня есть WEB API, который возвращает кэшированное значение.

У меня есть программное обеспечение Windows Form, которое вызывает WEB API раз в минуту, чтобы получить статус.

Все это прекрасно работает в разработкена локальном хосте, но не в производстве.

[EnableCorsAttribute("*", "*", "*")]
public class AzureStatusController : ApiController
{
    private readonly int statusTimerInterval = 60 * 1000; // every 60 seconds

    private static bool cloudStatus = false;

    static HttpClient client;
    private static string url = "";
    private static string code = "";

    private System.Threading.Timer cloudTimer;

    /// <summary>
    /// Classes Ctor
    /// </summary>
    public AzureStatusController()
    {
        cloudTimer = new System.Threading.Timer(OnAzureStatusCallback, null, 0, statusTimerInterval);

        url = ConfigurationManager.AppSettings["CloudFunctionsBaseUrl"].ToString();
        code = ConfigurationManager.AppSettings["CloudStatusCode"].ToString();
        client = new HttpClient();
        client.BaseAddress = new Uri(url);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    }

    private void OnAzureStatusCallback(object state)
    {
        var status = false;
        if (client != null && client.BaseAddress.ToString().Length > 30 && code.Length > 70)
        {
            try
            {
                var response = client.GetAsync(code);
                if (response != null && !response.IsFaulted)
                {
                    var result = response.Result;
                    if (result != null && result.IsSuccessStatusCode && result.Content != null)
                    {
                        string responseString = result.Content.ReadAsStringAsync().Result.Trim().ToLower();
                        status = (responseString.Contains("ok"));
                    }
                }
            }
            catch
            {
                status = false;
            }
        }
        cloudStatus = status;
    }

    /// <summary>
    /// Returns the cached value of the Azure status
    /// </summary>
    /// <returns></returns>
    [AllowAnonymous]
    [HttpGet]
    [Route("api/AzureStatus")]
    public IHttpActionResult Get()
    {
        return Ok(cloudStatus);
    }
}

У кого-нибудь есть идеи, что мне не хватает?

1 Ответ

1 голос
/ 12 июля 2019

Я обнаружил, что добавление .ToString () в конец моего вызова ConfigurationManager.AppSettings вызывало проблемы в работе, но не в разработке.Вместо того, чтобы тратить больше времени на эту проблему, я использовал следующий код:

public class AzureStatusController : ApiController
{
    private static bool cloudStatus = false;
    private static DateTime expiration;

    /// <summary>
    /// Classes Ctor
    /// </summary>
    public AzureStatusController()
    {
        expiration = DateTime.Now.AddHours(-1);
    }

    private void CheckAzureStatus()
    {
        var status = false;
        using (var client = new HttpClient())
        {
            // the following 2 lines should be changed to retrieve the info from 
            var url = ConfigurationManager.AppSettings["CloudFunctionsBaseUrl"];
            var code = ConfigurationManager.AppSettings["CloudStatusCode"];
            client.BaseAddress = new Uri(url);
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            try
            {
                var response = client.GetAsync(code);
                if (response != null && !response.IsFaulted)
                {
                    var result = response.Result;
                    if (result != null && result.IsSuccessStatusCode && result.Content != null)
                    {
                        string responseString = result.Content.ReadAsStringAsync().Result.Trim().ToLower();
                        status = (responseString.Contains("ok"));
                    }
                }
            }
            catch
            {
                status = false;
            }
        }
        cloudStatus = status;
        expiration = DateTime.Now.AddMinutes(1);
    }

    /// <summary>
    /// Returns the cached value of the Azure status
    /// </summary>
    /// <returns></returns>
    [AllowAnonymous]
    [HttpGet]
    [Route("api/AzureStatus")]
    public IHttpActionResult Get()
    {
        if (expiration < DateTime.Now)
        {
            CheckAzureStatus();
        }
        return Ok(cloudStatus);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...