2013-11-04 18 views
1

我正在开发一个使用C#和.NET Framework 4.0的WCF RESTful服务。在IIS 7服务器中记下异常原因

我所有的方法都是像这样的:

public List<User> GetAllUsers() 
{ 
    List<User> usersList = null; 
    OutgoingWebResponseContext ctx = 
     WebOperationContext.Current.OutgoingResponse; 

    try 
    { 
     using (var context = new AdnLineContext()) 
     { 
      context.Configuration.ProxyCreationEnabled = false; 
      if ((context.Users != null) && 
       (context.Users.Count() > 0)) 
      { 
       usersList = context.Users.ToList(); 

       ctx.StatusCode = System.Net.HttpStatusCode.OK; 
      } 
      else 
      { 
       // No users found. 
       ctx.SetStatusAsNotFound(); 
       ctx.SuppressEntityBody = true; 
      } 
     } 
    } 
    catch (Exception) 
    { 
     ctx.StatusCode = System.Net.HttpStatusCode.InternalServerError; 
     ctx.SuppressEntityBody = true; 
    } 

    return usersList; 
} 

正如你可以看到,有一个catch块来处理未处理的异常,并发送HTTP状态代码500作为响应。

我有这个添加到web.config追查这些例外:

<system.diagnostics> 
<sources> 
    <source name="UserTraceSource" switchValue="Error, Information, Warning, ActivityTracing" > 
    <listeners> 
     <add name="xml" 
     type="System.Diagnostics.XmlWriterTraceListener" 
     initializeData="D:\logs\MyTraces.svclog" /> 
    </listeners> 
    </source> 
</sources> 
<trace autoflush="true" /> 
</system.diagnostics> 

但是,当发生异常时我什么也没看到。

我必须添加到每个catch块来将ex.Message记录到跟踪日志中吗?

这是我web.config

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    </configSections> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.serviceModel> 
    <services> 
     <service name="MyProjectWCFService.MyProjectService" 
       behaviorConfiguration="MyProjectServiceBehaviour"> 
     <endpoint address="" 
        contract="MyProjectWCFService.IMyProjectService" 
        behaviorConfiguration="restfulBehavior" 
        binding="webHttpBinding" /> 
     </service> 
    </services> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="restfulBehavior"> 
      <webHttp /> 
     </behavior> 
     </endpointBehaviors> 
     <serviceBehaviors> 
     <behavior name="MyProjectServiceBehaviour"> 

      <serviceMetadata httpGetEnabled="true" /> 

      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
    </system.webServer> 
    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 
     <parameters> 
     <parameter value="v11.0" /> 
     </parameters> 
    </defaultConnectionFactory> 
    </entityFramework> 
    <connectionStrings> 
    <add name="MyProjectContext" 
      providerName="System.Data.SqlClient" 
      connectionString="Server=.\SQLEXPRESS;Database=MyProject;Integrated Security=True;MultipleActiveResultSets=True"/> 
    </connectionStrings> 
    <system.diagnostics> 
    <sources> 
     <source name="UserTraceSource" switchValue="Error, Information, Warning, ActivityTracing" > 
     <listeners> 
      <add name="xml" 
      type="System.Diagnostics.XmlWriterTraceListener" 
      initializeData="D:\log\MyProjectTraces.svclog" /> 
     </listeners> 
     </source> 
    </sources> 
    <trace autoflush="true" /> 
    </system.diagnostics> 
</configuration> 

回答

0

错误发生在web.config上。我还没有定义一个痕迹。

这是我已经解决了这个问题:

<system.diagnostics> 
<trace autoflush="true" > 
    <listeners> 
    <add name="myListener" 
     type="System.Diagnostics.TextWriterTraceListener" 
     initializeData="D:\log\MyProjectTraces.svclog" /> 
    <remove name="Default"/> 
    </listeners> 
</trace> 
</system.diagnostics> 

而且我还用詹姆斯的回答:

catch (Exception ex) 
{ 
    ctx.StatusCode = System.Net.HttpStatusCode.InternalServerError; 
    ctx.SuppressEntityBody = true; 
    System.Diagnostics.Trace.WriteLine(ex.Message, "GetAllUsers"); // log exception 
} 
0

您需要使用Trace类通知听众的东西需要被记录例如

catch (Exception ex) 
{ 
    ctx.StatusCode = System.Net.HttpStatusCode.InternalServerError; 
    ctx.SuppressEntityBody = true; 
    System.Diagnostics.Trace.WriteLine(ex.Message, "GetAllUsers"); // log exception 
} 
+0

谢谢您的回答,但我已经发表了我的项目在IIS 7你的代码和我在'MyTraces.svclog'上没有任何东西。 – VansFannel

+0

@VansFannel实际上看着你的配置,你没有任何实际的'TRACE'级别的监听器 - 例如,如果你在catch块的末尾调用'throw;',你的异常会被记录下来吗? – James

+0

我添加了'throw;'语句,并且没有得到记录的异常。 – VansFannel