RESTier PUT / PATCH未被调用

时间:2018-02-09 10:32:47

标签: c# .net asp.net-web-api2 odata restier

目前我正在开发一个安装了RESTier 1.0 NuGet-Package的项目。 我正在使用带有一些DTO的自定义模型构建器。 要构建API,我使用从ODataController继承的控制器。 到目前为止,查询或发布数据是没有问题的。

当我尝试使用PATCH或PUT请求更新记录时,不会调用相应的控制器操作,而是获得例外。

  1. 首先我确实让ChangeSetPreparer缺少例外。
  2. 更改后,我确实获得了空引用异常。
  3. 所以为了避免第一次我添加了一个ChangeSetInitializer和一个我在一些Github-Source中发现的SubmitExecutor(我不记得了):

    public class ExternalApi : ApiBase
    {
        public ExternalApi(IServiceProvider serviceProvider) : base(serviceProvider)
        {
        }
    
    public static new IServiceCollection ConfigureApi(Type apiType, IServiceCollection services)
    {
        return ApiBase.ConfigureApi(apiType, services)
        .AddService<IModelBuilder, CustomModelBuilder>()
        .AddService<IChangeSetInitializer, ChangeSetInitializer>()
        .AddService<ISubmitExecutor, SubmitExecutor>();
    }
    
    private class ChangeSetInitializer : IChangeSetInitializer
    {
        public Task InitializeAsync(SubmitContext context, CancellationToken cancellationToken)
        {
            context.ChangeSet = new ChangeSet();
            return Task.FromResult<object>(null);
        }
    }
    
    private class SubmitExecutor : ISubmitExecutor
    {
        public Task<SubmitResult> ExecuteSubmitAsync(SubmitContext context, CancellationToken cancellationToken)
        {
            return Task.FromResult(new SubmitResult(context.ChangeSet));
        }
    }
    }
    

    添加后,第一个问题似乎得到了解决,但我得到了以下stacktrace的空引用异常:

      

    贝   Microsoft.Restier.Publishers.OData.RestierController.CreateResult(类型   resultType,Object result)bei   Microsoft.Restier.Publishers.OData.RestierController.CreateUpdatedODataResult(对象   实体)bei   Microsoft.Restier.Publishers.OData.RestierController.d__3f.MoveNext()   --- EndederStappelüberwachungvomvorhergehenden Ort,dem dieAusnahmeausgelöstwurde--- bei   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)bei   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)bei   Microsoft.Restier.Publishers.OData.RestierController.d__20.MoveNext()   --- EndederStappelüberwachungvomvorhergehenden Ort,dem dieAusnahmeausgelöstwurde--- bei   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)bei   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)bei   System.Threading.Tasks.TaskHelpersExtensions.d__3`1.MoveNext()   --- EndederStappelüberwachungvomvorhergehenden Ort,dem dieAusnahmeausgelöstwurde--- bei   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)bei   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)bei   System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext()   --- EndederStappelüberwachungvomvorhergehenden Ort,dem dieAusnahmeausgelöstwurde--- bei   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)bei   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)bei   System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext()   --- EndederStappelüberwachungvomvorhergehenden Ort,dem dieAusnahmeausgelöstwurde--- bei   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)bei   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)bei   System.Web.Http.Controllers.ExceptionFilterResult.d__0.MoveNext()   --- EndederStappelüberwachungvomvorhergehenden Ort,dem dieAusnahmeausgelöstwurde--- bei   System.Web.Http.Controllers.ExceptionFilterResult.d__0.MoveNext()   --- EndederStappelüberwachungvomvorhergehenden Ort,dem dieAusnahmeausgelöstwurde--- bei   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)bei   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)bei   System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()   --- EndederStappelüberwachungvomvorhergehenden Ort,dem dieAusnahmeausgelöstwurde--- bei   System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()   --- EndederStappelüberwachungvomvorhergehenden Ort,dem dieAusnahmeausgelöstwurde--- bei   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)bei   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)bei System.Web.Http.HttpServer.d__0.MoveNext()

    这些是我使用的动作签名的示例:

    [EnableQuery]
    public IQueryable<StoreDTO> Get()
    [EnableQuery]
    public SingleResult<StoreDTO> Get([FromODataUri] int key)
    public async Task<IHttpActionResult> Post(StoreDTO store)
    public async Task<IHttpActionResult> Put([FromODataUri] int key, StoreDTO store)
        public async Task<IHttpActionResult> Patch([FromODataUri] int key, Delta<StoreDTO> store)
    

    我尝试了多种与DTO匹配的JSON-Objects,但是在调用Put或Patch之前我仍然得到空引用异常。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案或至少是一种解决方法。 我稍微改变了我的WebApiConfig。

而不是: 来自Microsoft.Restier.Publishers.OData.HttpConfigurationExtensions的MapRestierRoute(...) 我现在在使用: 来自System.Web.OData.Extensions.HttpConfigurationExtensions的MapODataServiceRoute(...)