目前,我正在开发一个安装了RESTier 1.0 NuGet软件包的项目。我使用的是带有一些DTO的自定义模型生成器。要构建API,我使用继承自ODataController的控制器。到目前为止,查询或发布数据并不是问题。
当我试图用补丁或PUT请求更新记录时,不调用相应的控制器操作,而是得到异常。
因此,为了避免第一种情况,我添加了一个ChangeSetInitializer和一个SubmitExecutor,这是我在Github中找到的(我再也不记得了):
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));
}
}
}添加了这些之后,第一个问题似乎已经解决了,但是下面的堆栈跟踪使我得到了空引用异常:
( bei Microsoft.Restier.Publishers.OData.RestierController.CreateResult(Type resultType,对象结果) bei Microsoft.Restier.Publishers.OData.RestierController.CreateUpdatedODataResult(Object实体) bei Microsoft.Restier.Publishers.OData.RestierController.d__3f.MoveNext() - Ende der Stapelüberwachung vom vorhergehenden Ort,一个dem die Ausnahme ausgel st wurde - bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task任务) bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task任务) bei Microsoft.Restier.Publishers.OData.RestierController.d__20.MoveNext() - Ende der Stapelüberwachung vom vorhergehenden Ort,一个dem die Ausnahme ausgel st wurde - bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task任务) bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task任务) bei System.Threading.Tasks.TaskHelpersExtensions.d__3`1.MoveNext() - Ende der Stapelüberwachung vom vorhergehenden Ort,一个dem die Ausnahme ausgel st wurde - bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task任务) bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task任务) bei System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext() - Ende der Stapelüberwachung vom vorhergehenden Ort,一个dem die Ausnahme ausgel st wurde - bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task任务) bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task任务) bei System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext() - Ende der Stapelüberwachung vom vorhergehenden Ort,dem die Ausnahme ausgel st wurdedem die Ausnahme ausgel st wurdedem die Ausnahme ausgel st wurde
下面是我使用的动作签名的示例:
[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对象,但即使在调用Put或Patch之前,我仍然获得空引用异常。
发布于 2018-02-13 11:24:32
我找到了解决办法,或者至少找到了解决办法。我改变了一下我的WebApiConfig。
而不是:MapRestierRoute(.)我现在使用的Microsoft.Restier.Publishers.OData.HttpConfigurationExtensions :MapODataServiceRoute(.)来自System.Web.OData.Extensions.HttpConfigurationExtensions
https://stackoverflow.com/questions/48703844
复制相似问题