【发布时间】:2015-09-02 15:02:24
【问题描述】:
我有一个与此非常相似的问题:Combine ADO.NET Data Service and custom ServiceContract in the same class?
(但是,我无法对此发表评论,因为我没有 50 声望......因此我必须提出一个新问题)
所以,我有一个 WCF 数据服务:
public class LearnDataService : DataService<LearnEntities>
{
// This method is called only once to initialize service-wide policies.
public static void InitializeService(DataServiceConfiguration config)
{
config.SetEntitySetAccessRule("Customers", EntitySetRights.All);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
}
}
我想用一些自定义的 WCF 服务操作来扩展它(他们将在现实生活中进行复杂的数据库查询,我将使用简单的调用来代替只是为了保持示例代码的简短)。所以,我创建了界面:
[ServiceContract]
public interface ICustomerService
{
[OperationContract]
List<Customer> GetCustomers();
[OperationContract]
Customer GetCustomerByCustomerId(string customerID);
}
像这样扩展服务类:
public class LearnDataService : DataService<LearnEntities>, ICustomerService
{
// This method is called only once to initialize service-wide policies.
public static void InitializeService(DataServiceConfiguration config)
{
config.SetEntitySetAccessRule("Customers", EntitySetRights.All);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
config.SetServiceOperationAccessRule("GetCustomers", ServiceOperationRights.AllRead);
config.SetServiceOperationAccessRule("GetCustomerByCustomerId", ServiceOperationRights.AllRead);
}
[WebGet]
public List<Customer> GetCustomers()
{
var customers = (from c in this.CurrentDataSource.Customers
select c).ToList();
return customers;
}
[WebGet]
public Customer GetCustomerByCustomerId(string customerID)
{
var product = (from c in this.CurrentDataSource.Customers
where c.CustomerID == customerID
select c).FirstOrDefault(); ;
return product;
}
}
现在,当我尝试使用该服务时,我得到:
LearnDataService 实现了多种服务契约类型,并且没有 端点在配置文件中定义。
好的,正如我在上面链接的问题的答案中所说,我将配置文件设置如下:
<services>
<service name="LearnService.LearnDataService">
<endpoint address="data" binding="webHttpBinding" contract="System.Data.Services.IRequestHandler" />
<endpoint address="cust" binding="webHttpBinding" contract="LearnService.ICustomerService" />
</service>
</services>
现在,我正在尝试在客户端项目中为此服务添加服务引用。使用“添加服务引用...”并按下发现按钮,(当然服务在没有调试的情况下运行),它发现 ht_tp://localhost:7947/LearnDataService.svc url,我得到一个 404(难怪,那里什么都没有听...)
因为我没有 10 个声望,所以我不能发布超过 2 个链接。这包括本地主机链接,所以我必须以这种方式破坏它们:(对不起
现在,我将地址修改为 ht_tp://localhost:7947/LearnDataService.svc/data,然后它正确地发现了 LearnEntities 服务,打开它时,我可以看到客户实体。到目前为止一切顺利,所以我检查了另一个服务,ht_tp://localhost:7947/LearnDataService.svc/cust。发现时,我收到一个错误:
下载时出错 'ht_tp://localhost:7947/LearnDataService.svc/cust/_vti_bin/ListData.svc/$metadata'。 请求失败,HTTP 状态为 404:未找到。元数据包含 无法解析的引用: 'ht_tp://localhost:7947/LearnDataService.svc/cust'。没有 端点监听http://localhost:7947/LearnDataService.svc/cust 可以接受该消息。这通常是由不正确的 地址或 SOAP 操作。有关更多信息,请参阅 InnerException(如果存在) 细节。远程服务器返回错误:(404) Not Found。如果 服务在当前解决方案中定义,尝试构建解决方案 并再次添加服务引用。
使用浏览器尝试这些 URL 时,ht_tp://localhost:7947/LearnDataService.svc/data 有效,并以 XML 格式显示数据,但 URL ht_tp://localhost:7947/LearnDataService.svc/ cust 给出 404:(未找到端点。)
你有什么想法,配置有什么问题?我是否正确理解了链接的 SO 问题的答案?
【问题讨论】: