【问题标题】:Best way to debug an Azure cloud service web role调试 Azure 云服务 Web 角色的最佳方式
【发布时间】:2014-09-23 22:01:33
【问题描述】:

我终于开始阅读有关 SOA 的文章,并且正在尝试使用 WCF 和 Azure 云服务。我发现特别困难的一件事是调试。假设我创建了一项服务并将其作为 Azure 云服务部署到 Web 并出现错误,我该如何检查这些错误是什么?我目前有一个接受普通旧 POCO 的服务,然后将数据添加到两个 Azure 数据库。我的操作合约方法返回一个布尔值,指示 CRUD 语句是失败还是通过。我不断得到一个错误的布尔值,但无法进入代码或使用日志记录方法记录每个代码行。

  public bool SubmitSupportRequest(SupportRequestPacket packet)
    {
        bool status;

        //convert SupportRequestPacket to entities
        var ameeEntity = new AccuDb_Entities.SupportTicket();
        var preferedEntity = new AccuDb_Entities.Support_Requests();
        //ameeEntity will be depreciated soon. Moving all support requests to Accu_Db (second entity)

        ameeEntity.Client = packet.Client;
        ameeEntity.Date = packet.Date;
        ameeEntity.Description = packet.Description;
        ameeEntity.FirstName = !string.IsNullOrEmpty(packet.FirstName) ? packet.FirstName : "None Provided";
        ameeEntity.Ip = !string.IsNullOrEmpty(packet.IP) ? packet.IP : "None Provided";
        ameeEntity.LastName = !string.IsNullOrEmpty(packet.LastName) ? packet.LastName : "None Provided";
        ameeEntity.MachineName = packet.MachineName;
        ameeEntity.ProblemFrequency = packet.ProblemFrequency;
        ameeEntity.TypeOfProblem = packet.TypeOfProblem;

        preferedEntity.Client = packet.Client;
        preferedEntity.Date = packet.Date;
        preferedEntity.Description = packet.Description;
        preferedEntity.FirstName = !string.IsNullOrEmpty(packet.FirstName) ? packet.FirstName : "None Provided";
        preferedEntity.Ip = !string.IsNullOrEmpty(packet.IP) ? packet.IP : "None Provided";
        preferedEntity.LastName = !string.IsNullOrEmpty(packet.LastName) ? packet.LastName : "None Provided";
        preferedEntity.MachineName = packet.MachineName;
        preferedEntity.ProblemFrequency = packet.ProblemFrequency;
        preferedEntity.TypeOfProblem = packet.TypeOfProblem;

        using (var tempContext = new AccuDb_Entities.ameesupporttickets_dbEntities())
        {
            try
            {
                tempContext.SupportTickets.Add(ameeEntity);
                tempContext.SaveChanges();
                status = true;
            }
            catch
            {
                status = false;
                return status;
            }

        }

        using (var context = new AccuDb_Entities.Accu_DbEntities())
        {
            try
            {
                context.Support_Requests.Add(preferedEntity);
                context.SaveChanges();
                status = true;
            }
            catch
            {
                status = false;
            }
        }

        return status;
    }

【问题讨论】:

    标签: wcf azure


    【解决方案1】:

    这是一个非常广泛的问题,如果不写一篇很长的文章,很难给出一个具体的问题。

    如果您使用的是云服务(听起来像您),那么您可以配置各种诊断日志记录,并在云项目中记录跟踪日志的传送。然后,您可以在 web.config 中配置一个跟踪侦听器,该侦听器将每隔一两分钟将您使用 Trace.Write 等记录的所有内容发送到 Azure 表存储,具体取决于您的配置,如下所示:

    <system.diagnostics>
       <trace>
          <listeners>
             <add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, 
                Microsoft.WindowsAzure.Diagnostics, 
                Version=2.3.0.0, 
                Culture=neutral, 
                PublicKeyToken=31bf3856ad364e35"
                name="AzureDiagnostics">
                <filter type="" />
             </add>
          </listeners>
       </trace>
    </system.diagnostics>​
    

    然后,您可以直接在表存储中读取这些日志,或者使用像 Cerebrate 这样的工具来获取更漂亮的格式。这将使您能够在代码执行时输出尽可能多的信息。

    需要注意的是,您可以使用不同的级别,因此您可以将消息记录为 Verbose,并且您可以在配置中更改传输到表存储的消息级别;这意味着您可以在调试后将日志记录调用保留在代码中,只需将传输级别切换为信息或警告,以避免在表存储中看到详细消息。

    如果您还打开了一些诊断监控和站点日志记录,您还可以将各种其他统计信息存储到表存储中。

    与任何“正常”的 WCF 调试一样,您可以在 Web.config 中打开许多 WCF 特定的转储选项,这将在磁盘上生成跟踪文件。然后,您可以 RDP 到您的云服务中检索这些文件(我假设您熟悉 WCF,如果不熟悉,请道歉)。

    根据您的 Visual Studio 版本,您还可以在启用 Intellitrace 的情况下进行部署,然后您可以下载这些文件并在 Visual Studio 中回放它们。

    抱歉,我有点含糊其辞,这是一个相当大的主题,您需要花一些时间来研究它才能理解。

    哦,如果您查看 Azure 网站,那里的一切都不同(尽管可以说更好,因为您可以进行尾部日志记录)。

    顺便说一句,如果您构建一个全新的 SOA 系统,您可能希望考虑使用 Web API 来构建 RESTful 服务,而不是使用 WCF。只是说':)

    【讨论】:

    • 你不遗余力地帮助我朝着正确的方向前进。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2015-07-31
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 2012-09-12
    • 2010-12-21
    • 1970-01-01
    相关资源
    最近更新 更多