微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

具有基本身份验证的Web参考失败

如何解决具有基本身份验证的Web参考失败

| 我有一个使用Apache CXF创建的Web服务,以及两个使用Web引用(而非服务引用)的.NET客户端。紧凑型框架客户端可以使用,但是.NET 4.0桌面客户端仅在与“ 0”对话时可以使用。这是客户端设置:
        var client = new Permission.Permission();
        client.Credentials = new NetworkCredential(username,password);
        client.PreAuthenticate = true;
        client.Url = url + \"/Permission\";
如果
url
http://localhost:8080/
,则呼叫成功,但如果是
http://127.0.0.1:8080
,则呼叫将失败,并显示错误401。由于某种原因,生成的客户端代码将在401响应处停止,并且不发送用户名和密码。 编辑:我找到了罪魁祸首,但我不知道最终答案。 Visual Studio已将此部分插入“ 5”文件中:
<applicationSettings>
    <MyService.Properties.Settings>
        <setting name=\"MyService_Permission_Permission\" serializeAs=\"String\">
            <value>http://localhost:8080/api/Permission</value>
        </setting>
    </MyService.Properties.Settings>
</applicationSettings>
如果我更改“ 5”以匹配所需的URL,则身份验证有效。所以我的关键问题是:我的代码如何命令生成的客户端切换到Web服务的其他实例,而无需编辑
app.config
并重新启动? 为了进一步了解背景,当我将服务代码移至另一台计算机时,Wireshark显示以下顺序: 服务客户:
 HTTP/1.1 100 Continue\\r\\n
客户服务:
 POST /api/Permission HTTP/1.1
 User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 4.0.30319.225)
 VsDebuggerCausalityData: uIDPo8B4pxEyITVOlb6i18R2juMAAAAACwClY0YyykuVhoiZKG7oEPZ1kukkB6NLnxx6RVnHjT8ACQAA
 Content-Type: text/xml; charset=utf-8
 SOAPAction: \"\"
 Host: xxxxxx:8080
 Content-Length: 307
 Expect: 100-continue
服务客户:
 HTTP/1.1 401 Unauthorized
 Content-Length: 0
 content-type: text/xml; charset=utf-8
 Expect: 100-continue
 Host: xxx:8080
 SOAPAction: \"\"
 User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 4.0.30319.225)
 VsDebuggerCausalityData: uIDPo8B4pxEyITVOlb6i18R2juMAAAAACwClY0YyykuVhoiZKG7oEPZ1kukkB6NLnxx6RVnHjT8ACQAA
 WWW-Authenticate: Basic realm=realm
 Server: Jetty(6.1.25)
此时,客户端应重复POST并添加基本身份验证标头,但它将停止。     

解决方法

        我已经找到答案了。主机名“ 0”在Web参考中很神奇。在生成的代码中包含以下功能:
    private bool IsLocalFileSystemWebService(string url) {
        if (((url == null) 
                    || (url == string.Empty))) {
            return false;
        }
        System.Uri wsUri = new System.Uri(url);
        if (((wsUri.Port >= 1024) 
                    && (string.Compare(wsUri.Host,\"localHost\",System.StringComparison.OrdinalIgnoreCase) == 0))) {
            return true;
        }
        return false;
    }
}
通过将我的ѭ5更改为默认值127.0.0.1,我绕过了身份验证本地Web服务的特殊行为。 这个故事的寓意是:针对服务的本地实例开发Web参考客户端时,请不要在URL中使用“ 0”。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。