.NET Standard 2.0 MVVM项目添加RESTful WCF引用提示0终结点问题
针对你遇到的在.NET Standard 2.0 MVVM项目中添加运行正常的WCF REST服务引用时提示“未找到0个终结点”的问题,结合你的服务端配置和项目环境,我整理了几个最可能的原因及对应的解决办法:
1. 服务端元数据行为未正确绑定到服务
看你的web.config,虽然在<serviceBehaviors>里定义了开启元数据的行为(serviceMetadata httpGetEnabled="true"),但你的每个<service>标签都没有指定behaviorConfiguration属性,导致这个元数据行为并没有被应用到实际的服务上。添加服务引用工具依赖元数据来识别终结点,这是最可能的核心原因。
解决办法:
给每个服务节点加上behaviorConfiguration,关联到你的默认服务行为(因为你的默认行为name是空字符串,直接赋值为空即可):
<services> <service name="MoodWcfService.Services.UserService" behaviorConfiguration=""> <endpoint address="" behaviorConfiguration="UserService_Behavior" binding="webHttpBinding" contract="MoodWcfService.IServices.IUserService" > </endpoint> </service> <!-- 其他两个服务也做同样修改 --> </services>
或者更规范一点,给默认服务行为起个名字再关联:
<serviceBehaviors> <behavior name="DefaultServiceBehavior"> <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> <!-- 服务节点修改为 --> <service name="MoodWcfService.Services.UserService" behaviorConfiguration="DefaultServiceBehavior">
2. RESTful WCF不适合用“添加服务引用”的方式生成代理
WCF的webHttpBinding是用于REST风格服务的,而VS的“添加服务引用”工具本质是基于SOAP协议的WSDL元数据生成代理,对REST服务的支持并不友好。即使元数据配置正确,也可能出现识别不到终结点的情况。
推荐方案:
改用HttpClient直接调用REST服务,这也是.NET Standard项目调用REST服务的更通用、更稳定的方式。示例代码如下:
using System.Net.Http; using System.Net.Http.Json; using System.Threading.Tasks; public class UserServiceClient { private readonly HttpClient _httpClient; public UserServiceClient(string serviceBaseUrl) { _httpClient = new HttpClient { BaseAddress = new Uri(serviceBaseUrl) }; // 根据服务返回格式设置请求头 _httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); } // 示例:调用GET接口获取用户信息 public async Task<User> GetUserByIdAsync(int userId) { var response = await _httpClient.GetFromJsonAsync<User>($"users/{userId}"); return response; } // 示例:调用POST接口创建用户 public async Task<User> CreateUserAsync(User newUser) { var response = await _httpClient.PostAsJsonAsync("users", newUser); response.EnsureSuccessStatusCode(); return await response.Content.ReadFromJsonAsync<User>(); } }
3. .NET Standard项目的WCF兼容性限制
.NET Standard对WCF客户端的支持是有限的,如果你坚持要用服务引用的方式,需要确保项目安装了必要的NuGet包:
System.ServiceModel.Http:支持WCF HTTP客户端System.ServiceModel.Primitives:基础WCF客户端依赖
安装完成后,重新尝试添加服务引用。
4. 服务契约缺少REST属性标记
检查你的服务契约(IUserService等接口)是否正确标记了REST相关属性。如果没有这些属性,服务端的REST终结点无法正确暴露,也会导致元数据识别失败。
正确的契约示例:
using System.ServiceModel; using System.ServiceModel.Web; [ServiceContract] public interface IUserService { [OperationContract] [WebGet(UriTemplate = "users/{userId}", ResponseFormat = WebMessageFormat.Json)] User GetUser(string userId); [OperationContract] [WebInvoke(UriTemplate = "users", Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] User CreateUser(User user); }
5. 确认服务基地址和访问可达性
确保添加服务引用时输入的地址是IIS Express运行时的正确基地址(比如http://localhost:xxxx/),并且服务已经启动。你可以先在浏览器中访问服务的help页面(因为你开启了helpEnabled="true"),如果能看到服务的接口说明,证明服务运行正常且地址正确。
内容的提问来源于stack exchange,提问作者Mėta Bambalaitė

