我正在尝试使用 WebApi Odata 控制器创建 Windows 应用商店应用程序。经过一番努力,我的所有 Get 请求都正常工作,现在我转向 CRUD 方法,并在数据服务上下文的 EndSaveChanges 上收到以下异常。
<?xml version="1.0" encoding="utf-8"?>
<m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<m:code />
<m:message xml:lang="en-US">No HTTP resource was found that matches the request URI 'http://localhost:56317/odata/ESFClients(guid'f04ad636-f896-4de4-816c-388106cd39ce')'.</m:message>
<m:innererror>
<m:message>No routing convention was found to select an action for the OData path with template '~/entityset/key'.</m:message>
<m:type></m:type>
<m:stacktrace></m:stacktrace>
</m:innererror>
</m:error>
现在我认为这是来自http://aspnetwebstack.codeplex.com/workitem/822的 WebApi 中的一个错误,它隐藏了实际错误。为了确保它不是我的 Odata 端点,我创建了一个快速控制台应用程序来获取条目、更新它并修补它,一切正常。我的 WebApi Odata Controller 使用
public HttpResponseMessage Patch([FromODataUri] Guid key, Delta<ESFClient> patch)
As 方法从 ODataController 派生。在我的 Windows 应用程序中,我在 DataServiceContext 上有一个用于保存更改的扩展方法。
public static async Task<DataServiceResponse> SaveChangesAsync(this DataServiceContext context, SaveChangesOptions options)
{
var queryTask = Task.Factory.FromAsync<DataServiceResponse>(context.BeginSaveChanges(options, null, null),
queryAsyncResult =>
{
var results = context.EndSaveChanges(queryAsyncResult);
return results;
});
return await queryTask;
}
并从空白的 Windows Store XAML 页面调用更新。
public async Task UpdateWeekNo()
{
var container = new ESFOdataService.Container(new Uri("http://localhost:56317/odata/"));
var clients = (DataServiceQuery<ESFClient>)from p in container.ESFClients where p.UserID == new Guid("f04ad636-f896-4de4-816c-388106cd39ce") select p;
var result = await clients.ExecuteAsync();
var updatedClient = result.Single();
if (updatedClient != null)
{
updatedClient.WeekNo = 19;
container.UpdateObject(updatedClient);
await container.SaveChangesAsync(SaveChangesOptions.PatchOnUpdate); // Use PATCH not MERGE.
}
}
有没有人遇到过同样的问题,或者知道如何找出实际错误。一个有趣的点是,如果我在运行 Windows 应用程序时调试控制器,补丁方法不会被调用。