我正在尝试从VS2012进行非常简单的服务调用。 该服务位于代理外部的域上,需要登录凭据。
我已经为visuals studio中的服务设置了一个参考。此时我输入了远程domian用户名和密码,VS为我创建了所有代理类。
然后我将此行添加到appconf文件中。
<system.net>
<defaultProxy enabled="true" useDefaultCredentials="true">
</defaultProxy>
</system.net>
我认为这将允许我使用我自己的凭证
来完成我们的代理然后我冤枉了这段简单的代码
private void GetData()
{
OASIS.OasisServiceSoapClient o = new OASIS.OasisServiceSoapClient();
o.ClientCredentials.UserName.UserName = @"OtherDimain\UserName";
o.ClientCredentials.UserName.Password = "Password";
var d = o.SelectOfficersAll();
}
当然它没有用,我得到了每个人都发布的所有错误。
所以第一个问题是 我需要添加此
o.ClientCredentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials;
因为我做了并且仍然得到同样的愚蠢错误 “HTTP请求未经授权使用客户端身份验证方案'匿名'。从服务器收到的身份验证标头是'Negotiate,NTLM'。”
和内部异常
“{”远程服务器返回错误:(401)未经授权。“}”
所以我通过代理? 我使用自己的凭据吗? 我是否将正确的参数传递给服务模型?
一些示例显示上面代码中的用户名和密码属性是模拟当前作业。 但我在MSDN页面上读到这些是您要在远程服务上使用的凭据。帮助主题是暧昧的。如果我不在这里输入,那么如何?
我正在尝试做一些如此简单的事情,但似乎无法超越这一点。
答案 0 :(得分:0)
好的,谢谢我的同事肖恩。似乎取决于您是否正在调用Web服务或WCF服务确定您需要执行的操作。
因此,作为一项有效的网络服务
OASISWeb.OasisService s = new OASISWeb.OasisService();
s.Credentials = new System.Net.NetworkCredential("Username", "Password", "Domain");
var d = s.SelectOfficersAll();
DataSet x = (DataSet)d;
如果它是WCF服务,那么你需要这个
var service = new OasisTest2.ServiceReference1.OasisServiceSoapClient();
System.Net.WebRequest.DefaultWebProxy.Credentials = system.Net.CredentialCache.DefaultNetworkCredentials;
service.ClientCredentials.Windows.ClientCredential = new System.Net.NetworkCredential("Username", "Password", "Domain");
var result = service.SelectOfficersAll();
似乎WebRequest是一个全局对象,您需要在其上设置DefaultWebProxy.Credentails。
你怎么知道这个?当我搜索如何连接到MSDN上的WCF服务时,我从未找到任何对它的引用。必须是个秘密。所以请把它放在你的帽子下面。