Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在dotnetnuke模块中具有ASMX web服务_C#_Asp.net_Web Services_Dotnetnuke_Dotnetnuke Module - Fatal编程技术网

C# 在dotnetnuke模块中具有ASMX web服务

C# 在dotnetnuke模块中具有ASMX web服务,c#,asp.net,web-services,dotnetnuke,dotnetnuke-module,C#,Asp.net,Web Services,Dotnetnuke,Dotnetnuke Module,我已经实现了一个工作正常的DNN模块。现在,我的雇主想让我把一些特性公开为web服务。我想让一切保持干净和简单,所以我决定在我的模块中添加一个asmx web服务 web服务本身工作正常,但当我试图添加一个HttpModule来处理请求身份验证时,一切都搞砸了 我有一个AuthenticateRequest的事件处理程序,如下所示: private static void OnApplicationAuthenticateRequest(object sender, EventArgs e)

我已经实现了一个工作正常的DNN模块。现在,我的雇主想让我把一些特性公开为web服务。我想让一切保持干净和简单,所以我决定在我的模块中添加一个asmx web服务

web服务本身工作正常,但当我试图添加一个HttpModule来处理请求身份验证时,一切都搞砸了

我有一个AuthenticateRequest的事件处理程序,如下所示:

private static void OnApplicationAuthenticateRequest(object sender, EventArgs e)
        {
            var app = sender as HttpApplication;
            if (app == null || !(app.Request.Url.ToString().EndsWith("WebServices.asmx"))) return;
            var request = app.Request;
            var authHeader = request.Headers["Authorization"];
            if (authHeader != null)
            {
                var authHeaderVal = AuthenticationHeaderValue.Parse(authHeader);

                // RFC 2617 sec 1.2, "scheme" name is case-insensitive
                if (authHeaderVal.Scheme.Equals("basic",
                    StringComparison.OrdinalIgnoreCase) &&
                    authHeaderVal.Parameter != null)
                {
                    AuthenticateUser(authHeaderVal.Parameter);
                }
            }
            else
            {
                HttpContext.Current.Response.StatusCode = 401;    
            }
        } 
以下是客户端:

var service = new localhost.WebServices();
            var credentialsCache = new CredentialCache
            {
                {new Uri(service.Url), "Basic", new NetworkCredential("user", "password")}
            };

            service.Credentials = credentialsCache;
            Console.WriteLine(service.HelloWorld());
问题是没有授权头以这种方式添加到我的请求中。我搜索了一下,发现这里有一个循环,头不是第一次添加的,如果响应有一个基本的授权头,另一个请求将与头一起发送。因此,我添加了else部分:

else
                {
                    HttpContext.Current.Response.StatusCode = 401;    
                }
和EndRequest处理程序:

private static void OnApplicationEndRequest(object sender, EventArgs e)
        {
            var response = HttpContext.Current.Response;
            if (response.StatusCode == 401)
            {
                response.Headers.Add("WWW-Authenticate",
                    string.Format("Basic realm=\"{0}\"", Realm));
            }
        }
现在每次我发送请求,我都会被重定向到登录页面!!!我知道发生这种情况是因为存在另一个FormAuthentication HttpModule,如果StatusCode为401,它会将请求重定向到登录页面

请告诉我我做错了什么?有没有办法防止其他HttpModule干扰我的响应

更新


我将PreAuthenticate属性设置为true,但仍然没有发送授权标头

请参见,如果一致意见为否,则不应发送!这不是一个标记:这显示了问题的范围。我的意思是,我不是说一般的web服务,而是在dotnetnuke模块中。你最好将范围添加到你的问题中,而不是像上次编辑那样使用标记-title这样的标记样式