每次重新打开ASP.NET MVC项目都需重建WCF服务引用,该如何解决?
每次重新打开ASP.NET MVC项目都需重建WCF服务引用,该如何解决?
兄弟,我太懂这种烦躁了!每次打开项目都要删了重加服务引用,好好的开发节奏全被打断。我之前踩过这个坑,下面几个亲测有效的方案,你可以挨个试试:
方案1:用SvcUtil手动生成客户端代理,摆脱VS服务引用依赖
VS自动生成的服务引用有时候会抽风,手动用工具生成代理反而更稳定:
- 打开对应版本的VS开发者命令提示符(比如用.NET Framework 4.8就开对应版本的命令行)
- 运行生成命令,替换成你的服务地址和自定义文件名:
svcutil.exe http://localhost/YourWcfService/Service.svc /out:YourServiceClient.cs /config:App.config - 把生成的
YourServiceClient.cs文件直接加到你的MVC项目里,再把生成的App.config里的端点、绑定配置复制到MVC项目的Web.config对应位置 - 之后直接用这个生成的客户端类调用服务就行,再也不用依赖VS的服务引用,元数据不会自动失效,除非你手动重新生成代理
方案2:排查服务引用的元数据地址与缓存问题
有时候是本地WCF服务的配置或者VS缓存搞的鬼:
- 检查WCF服务的端口:如果是用IIS Express托管的,每次重启可能会变端口,导致服务引用的元数据地址失效。这时候给WCF服务设个固定端口:右键WCF项目→属性→Web→把项目URL改成固定地址(比如
http://localhost:8080/YourWcfService),保存后重启服务 - 清理VS缓存:删除MVC项目下的
obj和bin文件夹,然后菜单栏点「生成→清理解决方案」,再重新生成项目,很多时候旧缓存的元数据会导致奇怪的错误
方案3:用ChannelFactory手动创建通道(最推荐!)
这是最灵活稳定的方式,完全不用服务引用,直接基于契约接口调用:
- 把WCF服务的契约接口(比如
IYourService)和所有数据契约类复制到MVC项目里(最好是抽成单独的类库,让WCF和MVC都引用,这样契约完全一致,不用重复复制) - 在MVC项目的Web.config里配置WCF的绑定和端点:
<system.serviceModel> <bindings> <basicHttpBinding> <binding name="BasicHttpBinding_IYourService" /> </basicHttpBinding> </bindings> <client> <endpoint address="http://localhost:8080/YourWcfService/Service.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IYourService" contract="IYourService" /> </client> </system.serviceModel>
- 在MVC代码里用ChannelFactory创建通道调用服务:
using (var channelFactory = new ChannelFactory<IYourService>("BasicHttpBinding_IYourService")) { IYourService serviceClient = channelFactory.CreateChannel(); // 调用你的服务方法 var serviceResult = serviceClient.GetYourData(); // 记得关闭通道 ((IClientChannel)serviceClient).Close(); }
- 这种方式完全脱离VS的自动生成机制,契约由你自己掌控,从根本上解决元数据过时和服务引用失效的问题,我现在一直用这种方式
如果嫌方案3改动大,先试试方案1或2,大概率能解决你的问题;要是想一劳永逸,方案3绝对是最优解。
内容来源于stack exchange
相关产品推荐
相关产品推荐

