2016-09-07 88 views
0

我正在使用ChannelFactory调用WCF服务(因为目标服务位置将根据环境而改变,我需要可配置的URL)。但是我得到的错误:通过channelfactory调用WCF webservice时出错 - 未经许可

The HTTP request is unauthorized with client authentication scheme 'Anonymous'. The authentication header received from the server was 'Negotiate,NTLM'.

我的调用代码

var myBinding = new BasicHttpBinding(); 
var myEndpoint = new EndpointAddress(webserviceAddress); 
var myChannelFactory = new ChannelFactory<IObjectService>(myBinding, myEndpoint); 
var serviceClient = myChannelFactory.CreateChannel(); 

我的WCF服务的web.config system.servicemodel部分

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <bindings> 
     <basicHttpBinding> 
     <binding> 
      <security mode="TransportCredentialOnly"> 
      <transport clientCredentialType="Windows"/> 
      </security> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <protocolMapping> 
     <add binding="basicHttpsBinding" scheme="https" /> 
    </protocolMapping> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" minFreeMemoryPercentageToActivateService="0" /> 
    </system.serviceModel> 

服务应基于Windows身份验证进行身份验证。默认情况下,上面的调用代码会使用Windows身份验证来传递代码以(服务帐户)身份运行的帐户,但它似乎在发送匿名消息

+0

您的服务是否托管在IIS中?是否禁用匿名身份验证? – Tim

回答

0

您必须设置使用消息凭据传输的模式,如在下面的代码所示:

var myBinding = new BasicHttpBinding(); 
myBinding.Security.Mode = SecurityMode.TransportCredentialOnly; 

作为替代方案,可以在结合的构造设置的模式:

var myBinding = new BasicHttpBinding(SecurityMode.TransportCredentialOnly); 

另外设置ClientCredential:

myBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows; 
+0

谢谢,这有帮助。虽然该消息凭证选项仅适用于我没有的HTTPS,但只有HTTP。我尝试过TransportCredentialOnly,但它说绑定之间不匹配,即使TransportCredentialOnly是我在我的web.config? – NZJames

+0

你说得对,我在Security.Mode上犯了一个错误。我已经更新了我的答案。你能否发布整个错误信息? –