1

此问题与具有自定义提供程序的 WCF 数据服务有关。直到最近,我们还没有遇到 IDataServiceQueryProvider 或 IDataServiceUpdateProvider 的实现引发的异常的任何问题。我们当前面临的问题是 IDataServiceQueryProvider.GetPropertyValue 抛出的异常没有得到正确处理。例如,这个请求:

http://localhost:52788/NorthwindCustomers.svc/Customers('ALFKI')

有了这个实现:

public object GetPropertyValue(object target, ResourceProperty resourceProperty)
{
    throw new DataServiceException((int)HttpStatusCode.BadRequest, "Bad request!");
}

结果是:

HTTP/1.1 200 OK
<?xml version="1.0" encoding="utf-8"?><entry xml:base="http://localhost:52788/NorthwindCustomers.svc/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"><id>http://localhost:52788/NorthwindCustomers.svc/Customers('ALFKI')</id><category term="NorthwindModel.Customer" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /><link rel="edit" title="Customer" href="Customers('ALFKI')" /><m:error><m:code /><m:message xml:lang="en-US">Bad request!</m:message></m:error>

而从其他方法抛出相同的异常,例如:

public IQueryable GetQueryRootForResourceSet(ResourceSet resourceSet)
{
    throw new DataServiceException((int)HttpStatusCode.BadRequest, "Bad request!");
}

结果是预期的:

HTTP/1.1 400 Bad Request
<?xml version="1.0" encoding="utf-8" standalone="yes"?><error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"><code></code><message xml:lang="en-US">Bad request!</message></error>

我已经使用准系统服务和自定义提供程序复制了这一点,以消除由我们的生产实施引起的问题的可能性。

为什么框架会为 IDataServiceQueryProvider 和 IDataServiceUpdateProvider 方法的所有实现(GetPropertyValue 除外)引发的异常创建具有正确状态代码和正文的响应?

4

0 回答 0