搭建WCF(TCP)服务过程中遇到的各种问题

来源:互联网 发布:中国现货交易平台软件 编辑:程序博客网 时间:2024/05/16 06:23

吐槽一下:就一个简单的搭建TCP服务,结果在客户端引用的时候碰见各种问题,同事评价说“几乎常碰见的问题你都碰见了。。”就为解决这些问题,花费了1个多星期(请不要吐槽菜鸟的效率),在要崩溃的时候终于成功跑通了,这是一个很让你兴奋的事情。。在这里总结一下吧,最少让这段时间没有白白浪费。还有就是

调试很重要,Try……Catch…帮了大忙

1.在 ServiceModel 客户端配置部分中,找不到引用协定“WcfTcpServiceReference.IChaoService”的默认终结点元素。这可能是因为未找到应用程序的配置文件,或者是因为客户端元素中找不到与此协定匹配的终结点元素。

解决方案:这是在分层架构中经常遇到的问题,往往业务逻辑层和UI层是分离的,我们经常在业务逻辑层(我在Bll层)调用的服务引用,在成功后会生成一个app.config文件,其中

<system.serviceModel>···</system.serviceModel>

之中的信息是客户端对应所调用的服务端所生成的配置服务信息。但是在生成发布后往往只会保留UI层的web.config(或者app.config),所以必须在启动项目(UI层)的web.config(或者app.config)文件中加入客户端服务引用生成的app.config中的<system.serviceModel>```</system.serviceModel>中的内容


2.{“基础提供程序在 Open 上失败。”}
备注:{很可能由 IncludeExceptionDetailInFaults=true 创建的 ExceptionDetail,其值为:
System.Data.Entity.Core.EntityException: 基础提供程序在 Open 上失败。 —-> System.Data.SqlClient.SqlException: 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: Named Pipes Provider, error: 40 - 无法打开到 SQL Server 的连接) —-> System.ComponentModel.Win32Exception: 系统找不到指定的文件。**
解决方案:这种错误往往是因为服务端与数据库连接方面的错误。
我服务端采用了EF6+WCF,当我报这种错误时,在网上搜了很多,我是这么解决的:

  1. 打开SQL Server配置管理器, 确保SQL Server实例和SQL Server代理正在运行。。附图:(目的:我服务和数据库都是自己的电脑,这样确保127.0.0.1的远程连接可以用)
    SQL Server配置管理器
    【吐槽:这里说下win10中的SQL Server配置管理器被放在了计算管理中,和IIS、服务放在一起。。很蛋疼,附图】
    计算机管理

  2. 确保EF的实体数据模型能够实时的连接数据库

  3. 确保 表与表之间的关联关系。我是因为用户表与权限表之间存在依赖关系,但只有用户表有数据,所以报错。最终在数据库取消表之间的依赖关系就OK了。

3.部分客户端无法调用WCF服务。提示:服务绑定设置了安全设定,但并未正确设置安全配置。
解决方案:在服务端app.comfig中设定security mode=”None”如下

<bindings>      <netTcpBinding>        <binding xxxxx />          <security mode="None" />        </binding>      </netTcpBinding></bindings> 

4.<endpoint address="mex" binding="mexTcpBinding" name="" contract="IMetadataExchange" />
IMetadataExchange是必须要配置的终结点信息。
2种方法:

  1. 在服务端app.config中的配置
    <endpoint address="mex" binding="mexTcpBinding" name="" contract="IMetadataExchange" />
  2. 在服务宿主程序后台通过代码加载,如下:
  ServiceHost SVCHost = new ServiceHost(typeof(DotNet.Mvc.WCF.WcfLibrary.SystemSvc));    ServiceMetadataBehavior SMB = SVCHost.Description.Behaviors.Find<ServiceMetadataBehavior>();           if (SMB == null)            {                SVCHost.Description.Behaviors.Add(new ServiceMetadataBehavior());            }          SVCHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex");            SVCHost.Open();

还有一些问题,只是文档忘记保存,所以消失了。。。这是教训,得吸取。。
附录一下我服务端的App.config文件,几乎所以得属性我都设置的最大字节数,所以省却了很多麻烦。

<!-- 服务端App.config--> <system.serviceModel>    <bindings>      <netTcpBinding>        <binding name="DPBinding" openTimeout="00:05:00" receiveTimeout="24.00:00:00" sendTimeout="00:05:00" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">          <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />          <reliableSession inactivityTimeout="24.00:00:00" />          <security mode="None" />        </binding>      </netTcpBinding>    </bindings>    <services>      <service behaviorConfiguration="ReleaseSvcBehavior" name="DotNet.Mvc.WCF.WcfLibrary.SystemSvc">        <endpoint address="net.tcp://127.0.0.1:50001/SystemSvc" binding="netTcpBinding" bindingConfiguration="DPBinding" name="" contract="DotNet.Mvc.WCF.WcfLibrary.ISystemSvc" />        <endpoint address="mex" binding="mexTcpBinding" name="" contract="IMetadataExchange" />        <host>          <baseAddresses>            <add baseAddress="net.tcp://127.0.0.1:50001/SystemSvc" />          </baseAddresses>        </host>      </service>    </services>    <behaviors>      <serviceBehaviors>        <behavior name="ReleaseSvcBehavior">          <!-- 为避免泄漏元数据信息,          请在部署前将以下值设置为 false -->          <serviceMetadata httpGetEnabled="false" />          <!--<serviceMetadata httpGetEnabled="false" httpsGetEnabled="True" />-->          <!-- 要接收故障异常详细信息以进行调试,          请将以下值设置为 true。在部署前设置为 false             以避免泄漏异常信息-->          <serviceDebug includeExceptionDetailInFaults="true" />          <serviceThrottling maxConcurrentCalls="5000" maxConcurrentSessions="5000" maxConcurrentInstances="5000" />          <dataContractSerializer maxItemsInObjectGraph="6553600" />        </behavior>      </serviceBehaviors>      <endpointBehaviors>      </endpointBehaviors>    </behaviors>  </system.serviceModel>

最后:闲了2个月,项目组终于要有活了,貌似是Html5+WebSocket。。不过不能半途而废啊。空闲时刻还是要继续我的MVC5+EF6+WCF4的新手旅途。。

0 0
原创粉丝点击