以下在本地主机上的开发工作,但在生产中没有

Posted

技术标签:

【中文标题】以下在本地主机上的开发工作,但在生产中没有【英文标题】:The following works in development on a local host but in production does not 【发布时间】:2019-11-21 11:30:58 【问题描述】:

我创建了一个类,它有一个计时器,该计时器调用在我的 Azure 帐户中创建的函数以返回 azure 的状态,返回值被缓存。在类中,我有一个返回缓存值的 WEB API。

我有 Windows 窗体软件,每分钟调用一次 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) 生成状态消息的 Azure 函数 2) 每分钟轮询函数并存储缓存值的 WebAPI 控制器,然后可用于 3) A Windows 窗体应用程序。我的问题是——这三件中的哪一件在生产中不起作用,具体是什么不起作用?例如消息丢失、抛出错误或计时器未触发。如果您遇到错误,请编辑以添加堆栈跟踪。发布表单和函数的相关代码也可能会有所帮助。 我收到一则错误消息 "Message":"An error has occurred."。没有堆栈可追踪。我最终确实让我的系统管理员打开了服务器调试,并且我收到了更多信息(虽然不是真的有用)。经过更多测试后,我发现问题出在 ConfigurationManager.AppSettings 调用的 .ToString() 部分。尽管摆脱 .ToString() 确实解决了我的问题,但这也没有什么意义。 现在可以用了吗? 是的。很抱歉在我的回复中没有明确说明。 太棒了!请考虑将此作为答案发布 - 这将使处于相同情况的其他人更容易找到解决方案。 【参考方案1】:

我最终发现将 .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);
    

【讨论】:

以上是关于以下在本地主机上的开发工作,但在生产中没有的主要内容,如果未能解决你的问题,请参考以下文章

PHP DOMNodeList错误:在开发人员中有效,但在生产中无效

生产中的 Firebase 消息传递

Laravel 视图在生产中工作但不在本地

开发中的有效 jQuery 在生产中失败

砌体 jquery 不会在生产中呈现(Heroku)

Tailwind 自定义背景图像在生产中不起作用