3

我已经使用 Visual Studio 使用 servicestack 实现了一个 web 服务。从 vs 调试器运行服务就可以了。我刚刚尝试将它部署到使用 XSP4 的 debian 机器上。该服务使用日志记录,据我所知该服务已启动并正在运行。启动服务时会创建一个日志文件,但我提出的任何请求都不起作用。例如,我使用浏览器发出以下请求:

http://127.0.0.1/Activity/5b1e5316-8ea5-4ba5-aaee-7f40151b80d3/Unit

但是浏览器被重定向到:

http://127.0.0.1/login.aspx?ReturnUrl=%2fActivity%2f5b1e5316-8ea5-4ba5-aaee-7f40151b80d3%2fUnit

我已经使用我在 Configure 方法中添加的全局请求过滤器实现了我自己的身份验证。我很困惑为什么将请求重定向到 login.aspx。此外,在日志文件中看到以下内容:

错误 2013-01-10 00:07:53.2631 NotFoundHttpHandler 192.168.23.2 未找到请求:/login.aspx?ReturnUrl=%2fActivity%2f5b1e5316-8ea5-4ba5-aaee-7f40151b80d3%2fUnit

有谁知道可能导致这种行为的原因?这是添加全局过滤器的代码:

this.RequestFilters.Add((httpReq, httpResp, requestDto) =>
        {
            try
            {
                var userCreds = httpReq.GetBasicAuthUserAndPassword();

                if (userCreds == null)
                {
                    httpResp.ReturnAuthRequired();
                    return;
                }

                var userName = userCreds.Value.Key;
                var userPass = userCreds.Value.Value;

                if (!TryResolve<IAuthenticationProvider>().AuthenticateUser(userName, userPass))
                {
                    httpResp.ReturnAuthRequired();
                }

                return;
            }
            catch (Exception ex)
            {   
                log.Error(ex);
                throw new ApplicationException(ex.Message, ex);
            }
        });
4

2 回答 2

3

我刚刚想通了。我添加了

<authentication mode="None" />

像这样到 Web.config :

<system.web>
    <!-- mode=[Windows|Forms|Passport|None] -->
    <authentication mode="Windows" />
</system.web>

可在此处找到文档:msdn.microsoft.com/en-us/library/aa291347(v=vs.71).aspx

于 2013-10-13T07:10:50.930 回答
2

我使用下面的代码片段解决了我的问题,即 .NET Forms 身份验证覆盖了我试图通过 ServiceStack.NET 返回的 401。在每个请求上,如果是 AJAX,则在开始时立即抑制该行为。这个标志是由 MS 为这个目的而创建的。http://msdn.microsoft.com/en-us/library/system.web.httpresponse.suppressformsauthenticationredirect.aspx

请注意,搜索时出现的许多其他解决方案会告诉您禁用 .NET 身份验证,这在大多数情况下根本不可行。此代码无需其他修改即可工作。

protected void Application_BeginRequest()
{
    HttpRequestBase request = new HttpRequestWrapper(Context.Request);
    if (request.IsAjaxRequest())
    {
        Context.Response.SuppressFormsAuthenticationRedirect = true;
    }
}
于 2014-01-03T21:30:54.583 回答