2015-03-31 69 views
1

我有我下面的客户端的app.config使用WCF服务引用:重构WCF服务的客户实例从app.config中代码

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="WSHttpBinding_ManagerService"> 
       <security> 
        <message clientCredentialType="UserName" /> 
       </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://myadress:8080/ManagerService.svc" 
      binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ManagerService" 
      contract="Service.ManagerService" name="WSHttpBinding_ManagerService"> 
      <identity> 
       <certificate encodedValue="AwAAAAEAAAAUAAAAaJ8gJ+2BbDC//Nw76gp1Rx4Ii1AgAAAAAQAAACQDAAAwggMgMIICDKADAgECAhB4jlXUsVcUkE45Bq9sj6cdMAkGBSsOAwIdBQAwIzEhMB8GA1UEAxMYc2tpbGxjb25vbXkuY2xvdWRhcHAubmV0MB4XDTA2MTIzMTIyMDAwMFoXDTE5MTIzMTIyMDAwMFowIzEhMB8GA1UEAxMYc2tpbkjsahdjhdjsdhsjhdsjhdjhdsjhdFAAOCAQ8AMIIBCgKCAQEAwHjDPi/A7+4PfvYt40eySE2I6FgVO2Ewco8gJO21TUqHpKbinmsaNTO6wFJy+l3adMRB0dcmAvH938BPgdwbqbVaaG4mRCDpnekEserWmz5ii+ET1xhm0atIg6xW3sgnDOA+41Y0vB8m8AXTfHQYunILQjn/6xGM/RffK32vbR9WGJKEd/okOJ2/vV5dm2UsejlANwK2kCMe9wNRbjaKsH6PIqv26KeHAXxa0tSzoHfrn/lr46+54WzEXFHRzub1JbZk+IsdsdlakasjdksjdjdksjddjskdZZ0Oj0iG0GjvEVbmHWpBM/WhHrqIfGdqiMtXjOtwIDAQAsdsdsdsdsdsdsdaZtgIq+y6hm91EfPUToJ1ZUhWR8z/RG+IVZrs0O93FCMk6WU8OhYxubIgcVSTx0FDCakyOmfu1gnYeEZv53kVPZSmY4KUAUZz+MCQf/OXN2OGv9cRmsWg4iDlHjzDQwucO+rWkclvQo=" /> 
      </identity> 
     </endpoint> 
    </client> 
</system.serviceModel> 

我现在需要重构实例化一个工作空白的app.config:

这里是我试过:

var binding = new WSHttpBinding(); 
binding.Security = new WSHttpSecurity { Mode = SecurityMode.Message }; 
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;    
var store = new X509Store(StoreName.CertificateAuthority, StoreLocation.CurrentUser); 
store.Open(OpenFlags.ReadOnly); 
var cers = store.Certificates.Find(X509FindType.FindByThumbprint, "123THUMBPRINTOFCERT", false); 
var cer = cers[0]; 
var identity = new X509CertificateEndpointIdentity(cer); 
var endpoint = new EndpointAddress(new Uri("http://myservice:8080/ManagerService.svc"), identity); 
var client = new ManagerServiceClient(binding, endpoint); 
client.ClientCredentials.UserName.UserName = EMail; 
client.ClientCredentials.UserName.Password = Password; 
var resultBuilder = new StringBuilder(); 
var categories = client.Categorize(Text); 

这将引发异常:

System.ServiceModel.Security.MessageSecurityException:客户端无法 确定基于在 SspiNegotiation/Kerberos的目的的 目标地址“http://myservice:8080/ManagerService.svc”身份服务主体名称。目标地址标识 必须是UPN标识(如acmedomain \ alice)或SPN标识(如 主机/ bobs-machine)。

我检查了在商店中找到了正确的证书。我会很高兴得知我在这里失踪的内容,以及我在这里的方式是否一般...?

回答

2

你失去了clientCredentialType="UserName"

binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName; 
+0

你好,非常感谢你!我已经添加了该行(我也更新了该问题),不幸的是我仍然得到相同的异常。你看到其他东西在这里失踪了吗? – Marc 2015-03-31 20:22:05

+0

你明白了......我失踪了:binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;感谢您的帮助,如果没有您的提示,本来就很难找到!我已经编辑了你的答案并希望,你对此很酷;) – Marc 2015-04-01 07:00:58