使用wcf时无法访问Elmah错误日志

时间:2014-06-03 11:37:52

标签: asp.net web-services wcf elmah

我一直在尝试将ELMAH用于WCF,并且已将“正常”ErrorHandlerServiceErrorBehavior添加到服务中。这些工作,我可以看到,当这些运行中的代码存在异常并将错误记录到ELMAH时。所以应该没问题但是当我尝试访问错误日志页面elmah.axd时,我得到了HTTP 404,而WCF给了我“端点未找到页面”。

这意味着该网址上未使用Elmah.ErrorLogPageFactory。所以归结为我的web.config(我认为)。我只是无法做到这一点,这是我web.config的相关部分:

我的服务端点设置如下:

<system.serviceModel>
   <standardEndpoints>
      <webHttpEndpoint>
         <standardEndpoint name="" helpEnabled="true" 
                           automaticFormatSelectionEnabled="true" />
      </webHttpEndpoint>
   </standardEndpoints>
   <serviceHostingEnvironment aspNetCompatibilityEnabled="true" 
                              multipleSiteBindingsEnabled="true" />
   <services>
       <service name="SaraService.SaraService"
                behaviorConfiguration="SaraSvcBehaviour" >
          <endpoint name="SaraService" 
              address="" 
              binding="webHttpBinding" bindingConfiguration="webHttpBindingWithJsonP" 
              behaviorConfiguration="RestEndPointBehaviour"
              contract="SaraService.ISaraService" />
          <endpoint 
              address="soap" 
              behaviorConfiguration="SoapEndPoinstBehaviour" 
              binding="basicHttpBinding" 
              contract="SaraService.ISaraService" />
          <endpoint 
              address="mex" 
              binding="mexHttpBinding" 
              contract="IMetadataExchange" />
      </service>
   </services>
   <behaviors>
      <serviceBehaviors>
         <behavior name="SaraSvcBehaviour">
            <serviceMetadata httpGetEnabled="true" />
            <serviceDebug includeExceptionDetailInFaults="true"/>
         </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
         <behavior name="RestEndPointBehaviour">
             <webHttp />
         </behavior>
         <behavior name="SoapEndPoinstBehaviour">
         </behavior>
      </endpointBehaviors>
   </behaviors>
   <bindings>
      <webHttpBinding>
         <binding name="webHttpBindingWithJsonP" 
                  crossDomainScriptAccessEnabled="true">
         </binding>
      </webHttpBinding>
   </bindings>
</system.serviceModel>

因此在/和/ soap网址中有端点。

我的ELMAH配置是这样的:

<system.web>
   <compilation debug="true" targetFramework="4.5" />
   <httpRuntime targetFramework="4.5" />
   <httpModules>
       <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
       <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />
       <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" />
   </httpModules>

                                      

</system.web>
</location>
<system.webServer>
  <handlers>
    <add name="ELMAH" verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" preCondition="integratedMode" />
  </handlers>
</system.webServer>

我还在根网址中运行AutofacServiceHostFactory。这是相关部分的global.asax.cs:

public class Global : System.Web.HttpApplication
{
    protected void Application_Start(object sender, EventArgs e)
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<SaraService>();
        builder.RegisterType<MarkkinadataAccess.MarkkinadataEntities>().InstancePerLifetimeScope();
        builder.RegisterType<GenerisDbConnectionSettings>().As<IGenerisDbConnectionSetting>().SingleInstance();
        builder.RegisterType<GenerisApplication>().As<IGenerisApplication>().PropertiesAutowired().InstancePerLifetimeScope();

        builder.RegisterType<CrmProductsQuery>().As<ICrmProductsQuery>();
        builder.RegisterType <ProductsByNameQuery>().As<IProductsByNameQuery>();
        builder.RegisterType<ProductMWQueryByName>().As<IProductMWQueryByName>();
        builder.RegisterType<ProductMWQueryById>().As<IProductMWQueryById>();

        AutofacHostFactory.Container = builder.Build();

        RouteTable.Routes.Add(new ServiceRoute("", new AutofacServiceHostFactory(), typeof(SaraService)));
    }
}

所以我的猜测是,在root中运行服务端点或AutofacServiceHostFactory以某种方式阻止我访问/elmah.axd url中的ELMAH日志页面。

但我只是不明白为什么或如何。

无论如何,我们非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

好的,我现在得到了这个(部分至少)。罪魁祸首是我的global.asax中的这一行:

RouteTable.Routes.Add(new ServiceRoute("", new AutofacServiceHostFactory(), typeof(SaraService)));

因此,这将使服务端点成为root,这就是我想要的。

另外,我只想要一个路由(除root之外的任何路由)来访问ELMAH错误日志页面。这当然意味着必须有一个带有运行Elmah.ErrorLogPageFactory的处理程序的路由。

现在这应该很简单,但是当我将我的服务添加到根URL时,似乎无论如何我都无法使用处理程序(axd)访问任何路径。

这对我来说似乎很奇怪,因为我可以在www / index.html中创建一个文件,并且可以在没有触及web.config的情况下正常提供。但是在像elmah.axd或www / elmah.axd这样的“生成”路由的情况下,我在根URL中添加的服务将始终被执行。给我“无端点”页面,它是WCF管道HTTP 404。

在任何情况下,如果我将我的服务放到除root之外的某个URL,我可以访问ELMAH错误日志。

是的,我确实尝试忽略了elmah.axd网址,但它只是给了我正常的404错误。

所以我想我只需将我的服务放在除root之外的某个地方,除非有人能提出更好的答案来做到这一点。