WCF调用服务失败

时间:2011-08-18 06:33:03

标签: .net wcf iis

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

  

无法调用该服务。可能的原因:服务处于脱机状态   或无法进入;客户端配置与   代理;现有代理无效。请参阅堆栈跟踪   更多详情。您可以尝试通过启动新代理进行恢复,然后进行恢复   默认配置或刷新服务。

     

堆栈跟踪错误详细信息

     

由于内部错误,服务器无法处理请求。   有关错误的更多信息,请打开   IncludeExceptionDetailInFaults(来自ServiceBehaviorAttribute   或者来自服务器上的<serviceDebug>配置行为)   命令将异常信息发送回客户端,或打开   跟踪Microsoft .NET Framework 3.0 SDK文档和   检查服务器跟踪日志。

     

服务器堆栈跟踪:
  在System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(消息   回复,MessageFault错误,字符串操作,MessageVersion版本,   FaultConverter faultConverter)
  在System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime)   操作,ProxyRpc&amp; RPC)
  在System.ServiceModel.Channels.ServiceChannel.Call(String action,   Boolean oneway,ProxyOperationRuntime操作,Object [] ins,   对象[]出局,TimeSpan超时)
  在System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage)   methodCall,ProxyOperationRuntime operation)
  在System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage   消息)

     

在[0]处重新抛出异常:
  在System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage   reqMsg,IMessage retMsg)
  在System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&amp;   msgData,Int32类型)
  在IUserService.GetUser(String UserID)
  在UserServiceClient.GetUser(String UserID)

以下是源代码:

    来自wcfservicelirbrary的
  1. app.config文件

    <?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. 来自WCF网站主机的Web配置文件

    <?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>
    

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

与WCF错误一样,密钥很可能就在堆栈跟踪的底部:

UserServiceClient.GetUser(String UserID)

这就是导致错误的原因。

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

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

预感:任何机会都是UserID null吗?如果是这样,并且您不期望它,最近服务合同是否已更改?将System.Runtime.Serialization添加到Service Viewer的诊断跟踪中可以显示更多信息:详细信息here

答案 2 :(得分:0)

WCF的最佳做法,

  1. 确保WCF项目网址与虚拟目录一起显示没有错误,并且可以生成代理(svcutil后跟超链接)
  2. 2一旦WCF正常,在客户端项目中,在ServiceReferences中,选择具有以上URL的配置服务, 3.那应该生成代理,如果它附加到源代码控制如TFS,请确保签入 - 删除模式签入,ALONG与新生成的文件(显示项目中的隐藏文件)

    1. 点击Reference.cs - &gt;进行酸测试以验证是否生成了新的datacontract或datamember字段,确认服务是最新的
    2. 所有那些令人讨厌的WCF参考错误难以解决,但重建可能会缓解一些......

答案 3 :(得分:0)

问题:我在其中一台Windows服务器上托管WCF服务时遇到了同样的问题。应用程序无法与服务连接。

解决方案:-必须重置WCF服务的应用程序/池

谢谢