在我的服务中,我有一个自定义身份验证提供程序,如果凭据无效,则会抛出HttpError:
throw HttpError.Unauthorized("Invalid Username or Password");
当我通过REST访问此服务并故意输入无效凭据时,我得到了预期的响应:
{
"ResponseStatus": {
"ErrorCode": "Unauthorized",
"Message": "Invalid UserName or Password",
}
}
但是,通过SOAP客户端做同样的事情,我从IIS服务器得到一个Html响应:
这会导致我的SOAP客户端中断,因为它无法反序列化响应。如果请求中包含不正确的数据值,也会发生这种情况,例如在整数参数上设置字符串值。如果在我处理请求的某个服务中发生异常(即抛出HttpError.NotFound),则响应很好。我知道类似的问题已经回答here但是自2013年以来它没有更新过。有没有办法配置响应或覆盖它?
修改1
我已将web.config更新为如此(在system.webServer中,我必须使用“modules”而不是“httpModules”。):
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
<httpModules>
<add name="FormsAuthenticationDisposition" type="ServiceStack.SuppressFormsAuthenticationRedirectModule, ServiceStack" />
</httpModules>
<httpHandlers>
<add path="*" type="ServiceStack.HttpHandlerFactory, ServiceStack" verb="*" />
</httpHandlers>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true">
<add name="FormsAuthenticationDisposition" type="ServiceStack.SuppressFormsAuthenticationRedirectModule, ServiceStack" />
</modules>
<urlCompression doStaticCompression="true" doDynamicCompression="false" />
<handlers>
<add path="*" name="ServiceStack.Factory" type="ServiceStack.HttpHandlerFactory, ServiceStack" verb="*" preCondition="integratedMode" resourceType="Unspecified" allowPathInfo="true" />
</handlers>
</system.webServer>
我的AppHost有以下内容:
SetConfig(new HostConfig
{
HandlerFactoryPath = "/api"
});
SuppressFormsAuthenticationRedirectModule.PathToSupress = Config.HandlerFactoryPath;
但是我仍然遇到和以前一样的错误。我想知道这是否是由于我将凭据作为每个请求的标头传递而不是首先进行专门的身份验证?值得指出的是,例如,当发生同样的错误时在整数参数上设置字符串。
修改2
这个解决方案确实有效。我正在定义不正确的HandlerFactoryPath:
SetConfig(new HostConfig
{
HandlerFactoryPath = "api"
});
答案 0 :(得分:3)
黄色死亡屏幕是ASP.NET劫持未经授权的错误响应的错误响应的结果。您可prevent ASP.NET from hijacking the Error Response使用SuppressFormsAuthenticationRedirectModule
。
首先,您需要在web.config中注册HTTP模块:
<system.web>
<httpModules>
<add name="FormsAuthenticationDisposition" type="ServiceStack.SuppressFormsAuthenticationRedirectModule, ServiceStack" />
</httpModules>
</system.web>
<!-- Required for IIS 7.0 (and above?) -->
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<httpModules>
<add name="FormsAuthenticationDisposition" type="ServiceStack.SuppressFormsAuthenticationRedirectModule, ServiceStack" />
</httpModules>
</system.webServer>
接下来,配置模块的API所在的位置 - 默认为/ api,所以在你的AppHost配置中:
public override void Configure(Funq.Container container)
{
SetConfig(new HostConfig {
HandlerFactoryPath = "api",
});
//this is the configuration for Hijacking prevention
SuppressFormsAuthenticationRedirectModule.PathToSupress = Config.HandlerFactoryPath;
}