2009-08-20 139 views
2

我想从ASP.NET应用程序中调用我的服务中的方法,如下所示。ASP.NET客户端WCF故障排除 - 帮助!

public bool ValidateUser(string username, string password) 
{ 
    try 
    { 
     // String CurrentLoggedInWindowsUserName = WindowsIdentity.GetCurrent().Name; 
     // //primary identity of the call 
     // String CurrentServiceSecurityContextPrimaryIdentityName = 
     // ServiceSecurityContext.Current.PrimaryIdentity.Name; 
     // 
    } 
    catch (Exception ex) 
    { 
     FaultExceptionFactory fct = new FaultExceptionFactory(); 
     throw new FaultException<CustomFaultException>(fct.CreateFaultException(ex)); 
    } 
    return false; 
} 

的配置为我服务的客户机端是如下

<binding name="WSHttpBinding_IMembershipService" closeTimeout="00:01:00" 
    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
    bypassProxyOnLocal="false" transactionFlow="false" 
    hostNameComparisonMode="StrongWildcard" 
    maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" 
    textEncoding="utf-8" useDefaultWebProxy="false" allowCookies="false"> 
    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
     maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
    <reliableSession ordered="true" inactivityTimeout="00:10:00" 
     enabled="false" /> 
    <security mode="Message"> 
     <transport clientCredentialType="Windows" proxyCredentialType="None" 
     realm="" /> 
     <message clientCredentialType="Windows" negotiateServiceCredential="true" 
     algorithmSuite="Default" establishSecurityContext="true" /> 
    </security> 
</binding> 

我一直有问题是,当我把它;我收到以下异常消息。

Server Error in '/' Application. 

The communication object, System.ServiceModel.Channels.ServiceChannel, 
cannot be used for communication because it is in the Faulted state. 
Description: An unhandled exception occurred during the execution of 
the current web request. Please review the stack trace for more 
information about the error and where it originated in the code. 

Exception Details: System.ServiceModel.CommunicationObjectFaultedException: 
The communication object, System.ServiceModel.Channels.ServiceChannel, 
cannot be used for communication because it is in the Faulted state. 

Stack Trace: 

[CommunicationObjectFaultedException: The communication object, 
    System.ServiceModel.Channels.ServiceChannel, cannot be used for 
    communication because it is in the Faulted state.] 
    System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, 
     IMessage retMsg) +7596735 
    System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, 
     Int32 type) +275 
    System.ServiceModel.ICommunicationObject.Close(TimeSpan timeout) +0 

    System.ServiceModel.ClientBase`1.System.ServiceModel.ICommunicationObject. 
     Close(TimeSpan timeout) +142 
    System.ServiceModel.ClientBase`1.Close() +38 
    System.ServiceModel.ClientBase`1.System.IDisposable.Dispose() +4 
    Controls.Membership.accountLogin.ValidateUserCredentials(String UserName, 
      String Password) in C:\ Petition.WebClient\Controls\ 
           Membership\accountLogin.ascx.cs:49 
    Controls.Membership.accountLogin.Login1_Authenticate(Object sender, 
      AuthenticateEventArgs e) in C:\ WebClient\ Controls\Membership 
             \accountLogin.ascx.cs:55 

我不完全确定为什么我继续得到这个。以防万一,这里是我打电话给我的服务从客户端

private bool ValidateUserCredentials(string UserName, string Password) 
{ 
    bool boolReturnValue = false; 

    using(Members.MembershipServiceClient client = 
     new Controls.Members.MembershipServiceClient()) 
    { 
     try 
     { 
      boolReturnValue = client.ValidateUser(UserName, Password); 
     } 
     catch (FaultException<CustomFaultException> ex) 
     { 
      throw ex; 
     } 
    } 

    return boolReturnValue; 
} 

任何人有任何想法,我需要在这种情况下怎么办?

回答

5

WCF客户端代理是.NET中的两个地方之一,您不应该在实现IDisposable的类的实例周围实现using块。见Indisposable: WCF Gotcha #1

OBTW,摆脱客户端呼叫的try/catch块。除非你能以某种方式“处理”它,否则不要捕捉异常,而再次抛出它并不是“处理”它。

+1

上面的链接似乎已被破坏。这里有一个替代方案:http://web.archive.org/web/20080803051143/www.iserviceoriented.com/blog/post/Indisposable+-+WCF+Gotcha+1.aspx – Kit 2010-09-27 15:11:10

1

那么,利用您当前的客户端设置,您希望对您的消息进行加密和签名,并将您的Windows凭据作为身份发送。

如果尝试处理此请求的远程服务器是而不是在同一个LAN上,或者无法访问相同的Active Directory以验证这些用户凭据,您将收到此消息。

服务器和客户端上的安全设置必须匹配 - 例如,如果你的服务器有类似的东西

<security mode="None"> 

那么你必须在客户端上也有相同的设置。如果您的服务器无法验证Windows凭据,请不要使用它们。根本不使用任何安全性(除开发/测试之外,不建议使用)或允许匿名调用者(但仍然使用例如消息安全性),或者您必须定义调用者可以在其中对自身进行身份验证的自定义机制。

安全在WCF是一个广阔的领域:-)这里有一些链接,可以帮助获得关于这一主题的抓地力:

和所有的东西安全WCF相关的一个非常完整的,而且几乎令人生畏概述安全,有在CodePlex上的WCF Security Guidance

希望这可以帮助你开始!

马克

4

我敢肯定,你可能意识到了这一点,但如果没有,WCF跟踪可以证明在这些情况下很有帮助。

特别是在代码已发货,正在生产并且不可更新的情况下,但在服务器端引发了意外错误,例如,一个你没有在合同中指定的。

也能够查看消息的有效载荷可以是非常宝贵的。

要获取跟踪,请启用app.config中的WCF跟踪或等效功能。

这取决于您认为最可能发生错误的位置(客户端或服务器或两者),以确定您可能想要打开跟踪的位置。

然后使用Service Trace Viewer工具打开它生成的XML日志文件。

在我的机器上是C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\SvcTraceViewer.exe,但是你的位置可能有点不同。

请参阅MSDN上的Service Trace Viewer页面以获取更多信息。

0

消息:“CommunicationObjectFaultedException”通常发生了,当你不适用处置与使用块工作的渠道,所以你只需要添加一个声明中止这样的:

catch (Exception ex) 
{ 
    client.Abort(); 
} 

我希望这能帮你。