我一直在尝试将ELMAH用于WCF,并且已将“正常”ErrorHandler
和ServiceErrorBehavior
添加到服务中。这些工作,我可以看到,当这些运行中的代码存在异常并将错误记录到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日志页面。
但我只是不明白为什么或如何。
无论如何,我们非常感谢任何帮助。
答案 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之外的某个地方,除非有人能提出更好的答案来做到这一点。