2011-08-18 130 views
2

我能够在我自己的服务器中调用它,它可以工作,但是当我在IIS中托管wcf服务时会出现问题。此错误的详细信息如下...WCF调用服务失败

无法调用该服务。可能的原因:该服务离线 或无法访问;客户端配置与 代理不匹配;现有的代理无效。有关更多详细信息,请参阅 的堆栈跟踪。您可以尝试通过启动新代理,将 恢复为默认配置或刷新服务来进行恢复。

堆栈跟踪错误详细信息

服务器由于内部错误无法处理该请求。 有关错误的 IncludeExceptionDetailInFaults(无论是从ServiceBehaviorAttribute 或从<serviceDebug>配置行为)的服务器的详细信息,或者反过来在 为了将异常信息发送回客户端,或打开 跟踪按照微软.NET Framework 3.0 SDK文档和 检查服务器跟踪日志。

服务器堆栈跟踪:
在System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(消息 回复,MessageFault故障,字符串动作,MessageVersion版本, FaultConverter faultConverter)
在System.ServiceModel.Channels.ServiceChannel.HandleReply (ProxyOperationRuntime 操作,ProxyRpc & RPC)
在System.ServiceModel.Channels.ServiceChannel.Call(字符串动作, 布尔单向,ProxyOperationRuntime操作,对象[]插件, 对象[]奏,时间跨度超时)
在System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage 包括MethodCall,ProxyOperationRuntime操作)
在System.ServiceModel.Channels.ServiceChannelProxy.Invoke(即时聊天 消息)[0]时

异常重新抛出:
在System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(即时聊天 reqMsg,即时聊天retMsg)
在System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData & MSGDATA,的Int32类型)
在IUserService.GetUser(S特林用户ID)
在UserServiceClient.GetUser(字符串userid)

下面是源代码:

  1. 应用程序。从wcfservicelirbrary

    <?xml version="1.0" encoding="utf-8" ?> 
    <configuration> 
    
    <system.web> 
    <compilation debug="true" /> 
    </system.web> 
        <system.serviceModel> 
        <services> 
         <service name="UserServiceLibrary.UserService"> 
         <endpoint address="" binding="wsHttpBinding"  contract="UserServiceLibrary.IUserService"> 
          <identity> 
          <dns value="localhost" /> 
          </identity> 
         </endpoint> 
         <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
         <host> 
          <baseAddresses> 
          <add baseAddress="http://localhost:8732/Design_Time_Addresses/UserServiceLibrary/UserService/" /> 
          </baseAddresses> 
         </host> 
         </service> 
        </services> 
        <behaviors> 
         <serviceBehaviors> 
         <behavior> 
          <serviceMetadata httpGetEnabled="True"/> 
          <serviceDebug includeExceptionDetailInFaults="False" /> 
         </behavior> 
         </serviceBehaviors> 
        </behaviors> 
        </system.serviceModel>   
    </configuration> 
    
  2. 的Web配置文件配置文件从WCF网站主机

    <?xml version="1.0"?> 
    <configuration> 
    
        <system.web> 
        <compilation debug="false" targetFramework="4.0" /> 
        </system.web> 
        <system.serviceModel> 
        <services> 
         <service name="UserServiceLibrary.UserService"> 
         <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" 
        contract="IMetadataExchange" /> 
         <endpoint address="basic" binding="basicHttpBinding" bindingConfiguration="" 
        contract="UserServiceLibrary.IUserService" /> 
         <endpoint address="" binding="wsHttpBinding" contract="UserServiceLibrary.IUserService" /> 
         </service> 
        </services> 
        <behaviors> 
        <serviceBehaviors> 
         <behavior> 
    
         <serviceMetadata httpGetEnabled="true"/> 
    
          <serviceDebug includeExceptionDetailInFaults="false"/> 
         </behavior> 
         </serviceBehaviors> 
        </behaviors> 
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
    <system.webServer> 
        <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 
    </configuration> 
    
+2

首先,转到服务器并应用以下配置更新: http://msdn.microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute .includeexceptiondetailinfaults.aspx – dotnetnate

+0

另请看'UserServi ceClient.GetUser(String UserID)' - 这是最初发生异常的地方。发布你的代码和你从dotnetnate的建议获得的更多信息,以获得更好的答案:) – Tim

+0

好的,我会先尝试.... –

回答

1

像往常一样与WCF的错误,关键是在堆栈跟踪的底部,最有可能的权利:

UserServiceClient.GetUser(String UserID)

这是什么导致了错误首先,

若要检查,如果您有权访问服务器,请尝试将Visual Studio调试程序附加到托管您的WCF代码的IIS服务(通常为w3wp.exe)。 (通过Debug | Attach to Process ...执行此操作;您需要使用管理员权限运行,并选中“查看所有用户的进程”选项)。

如果您没有直接访问权将调试程序附加到服务,但可以调整该服务的配置文件,然后尝试WCF诊断跟踪(记录在MSDN here上)。这使您可以创建可以使用服务跟踪查看器查看的日志 - 您应该能够非常轻松地使用它查找有关该例外的更多信息。

一个预感:是UserID null,有没有机会?如果是这样,并且你不期望它会发生,服务合同最近是否有变化?将服务查看器的诊断跟踪添加System.Runtime.Serialization可以提供更多关于此的信息:详细信息here

+0

根据服务跟踪查看器,我得到这些错误消息 1.由于消息正文为空,因此无法读取正文。 2.没有可以通过动作'http://schemas.xmlsoap.org/ws/2004/09/transfer/Get'接受信息的频道。 3.用户'IIS APPPOOL \ ASP.NET v4.0'登录失败。 –

+2

啊,最后一个听起来像是你的问题;我的猜测是IIS在您的服务器上配置错误。还有其他的ASP.NET 4应用程序的工作吗?如果是这样,请检查服务的应用程序池凭据,因为它听起来像无法初始化,因为它的凭据不正确。 –

+0

@JeremyMcGee你是对的..这是我在应用程序池上的用户权限。谢谢:) – Muhammedh

1

确保运行托管服务的进程的帐户具有对数据库的访问权限。例如,在IIS的情况下,运行托管服务的应用程序池的帐户必须登录到数据库服务器,并且它必须具有在数据库中执行所有必要操作的权限。

+0

复制了答案从http://stackoverflow.com/questions/6594001/access-denied-error-for-a-method-in-web-service – Muhammedh

0

最佳实践与WCF,

  1. 请与虚拟目录一起确保WCF项目网址是显示了没有错误,并能生成代理(SvcUtil工具其次是超链接)

2一旦WCF是在客户端项目中,在ServiceReferences中,使用上面的URL选择配置服务, 3.这应该生成代理,如果它附加到像TFS这样的源代码控制,请确保签入 - 删除模式签入,也可以使用新生成的ALONG文件(显示项目中的隐藏文件)

  1. 点击Reference.cs - >做一个严峻的考验,以验证生成新的datacontract或字段数据成员,即确认服务是高达日期

所有那些讨厌的WCF引用错误很难解决,但重新生成可能会减轻某些时间...