2011-07-28 26 views
3

我无法找到我在做什么错误。如何使用引导令牌正确连接到WCF服务

当我尝试调用服务操作,我得到错误:

通信对象,System.ServiceModel.Channels.ServiceChannel,不能用于通信,因为它是处于故障状态。

using (Ref.SService_V1_0Client client = new Ref.SService_V1_0Client("RWS")) 
{ 
    var request = new Ref.IVISRequestStructure(); 
    request.Header = new Ref.RequestHeaderStructure(); 


    client.ChannelFactory.Credentials.SupportInteractive = false; 
    ChannelFactoryOperations.ConfigureChannelFactory(client.ChannelFactory); 
    ChannelFactoryOperations.CreateChannelWithIssuedToken<Ref.ISService_V1_0>(client.ChannelFactory, ((Microsoft.IdentityModel.Claims.ClaimsIdentity)(Page.User.Identity)).BootstrapToken); 
    client.StartTransaction("string argument"); 
} 

配置在web.config中:

<system.serviceModel> 
    <bindings> 
    <ws2007FederationHttpBinding> 
     <binding name="ws2007FederationUserName" closeTimeout="00:01:00" openTimeout="00:01:00" 
     receiveTimeout="00:10:00" sendTimeout="00:01:00" maxReceivedMessageSize="100000000"> 
     <security mode="TransportWithMessageCredential"> 
      <message issuedKeyType="SymmetricKey" negotiateServiceCredential="true"> 
      <issuer address="adress/STS/Issue.svc/trust/13/issuedtokenmixedsymmetricbasic256" binding="customBinding" bindingConfiguration="issuedtokenmixedsymmetricbasic256"/> 
      </message> 
     </security> 
     </binding> 
    </ws2007FederationHttpBinding> 
    </bindings> 
    <client> 
    <endpoint address="another_address/servicename.svc/ws2007Federation" 
     binding="ws2007FederationHttpBinding" bindingConfiguration="ws2007FederationUserName" 
     contract="Ref.ISService_V1_0" name="RWS" /> 
    </client> 
</system.serviceModel> 

回答

1

尝试使用CreateChannelWithIssuedToken调用的返回值来调用服务,而不是使用客户端变量。看到CreateChannel code in this sample for how CreateChannelWithIssuedToken is used.它看起来像这样:

var serviceClient = ChannelFactoryOperations.CreateChannelWithIssuedToken<Ref.ISService_V1_0>(client.ChannelFactory, ((Microsoft.IdentityModel.Claims.ClaimsIdentity)(Page.User.Identity)).BootstrapToken); 
serviceClient.StartTransaction("string argument");