如何为DTO类创建自定义POST控制器方法?

时间:2015-12-16 19:57:28

标签: asp.net-web-api odata

我创建了一个未映射到模型中任何SQL表的DTO类:

public class FooDTO
{
    public int Id { get; set; }
    public string Name { get; set; }
}

我在模型中创建了这种类型的实体集:

public override IEdmModel GetModel()
{
    var builder = new ODataConventionModelBuilder();

    builder.EntitySet<FooDTO>("FooDTOs");

    // ...
}

并创建了一个自定义控制器:

public class FooDTOsController : ODataController
{
    private IDatasourceFactory datasourceFactory;

    public FooDTOsController(IDatasourceFactory datasourceFactory)
    {
        this.datasourceFactory = datasourceFactory;
    }

    // The GET is working great.
    public IHttpActionResult Get()
    {
        var db = (MyModel)this.datasourceFactory;
        IQueryable<FooDTO> foos = db.Set<Foo>().Select(
            t => new FooDTO()
            {
                Id = t.Id,
                Name = "blah blah blah"
            });

        return Ok(foos);
    }

    // I am not getting here.
    [HttpPost]
    public IHttpActionResult Post(FooDTO entity)
    {
        System.Diagnostics.Debug.WriteLine("YEAH!");

        return Ok(entity);
    }
}

但是Post方法没有被执行。我已经尝试了很多方法来定义POST方法,但我找不到一个有效的方法。

将一些数据发布到我的控制器中会导致以下错误:

  

无法创建抽象类。

     

描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其来源的更多信息   在代码中。

     

异常详细信息:System.MissingMethodException:无法创建抽象类。

     

来源错误:   在执行当前Web请求期间生成了未处理的异常。可以使用例外来识别关于异常的起源和位置的信息   堆栈跟踪下面。

     

堆栈跟踪:   [MissingMethodException:无法创建抽象类。]      System.RuntimeTypeHandle.CreateInstance(RuntimeType类型,Boolean publicOnly,Boolean noCheck,Boolean&amp; canBeCached,RuntimeMethodHandleInternal&amp; ctor,Boolean&amp; bNeedSecurityCheck)+0
     System.RuntimeType.CreateInstanceSlow(Boolean publicOnly,Boolean skipCheckThis,Boolean fillCache,StackCrawlMark&amp; stackMark)+138
     System.Activator.CreateInstance(Type type,Boolean nonPublic)+105
     System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr,Binder binder,Object [] args,CultureInfo culture,Object [] activationAttributes,StackCrawlMark&amp; stackMark)+1528
     System.Activator.CreateInstance(Type type,BindingFlags bindingAttr,Binder binder,Object [] args,CultureInfo culture,Object [] activationAttributes)+191      System.Activator.CreateInstance(Type type,BindingFlags bindingAttr,Binder binder,Object [] args,CultureInfo culture)+27
     System.Web.HttpRuntime.CreateNonPublicInstance(Type type,Object [] args)+82
     System.Web.Configuration.HandlerFactoryCache..ctor(String type)+58
     System.Web.HttpApplication.GetFactory(String type)+104
     System.Web.MaterializeHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+262
     System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean&amp; completedSynchronously)+137

     

版本信息:Microsoft .NET Framework版本:4.0.30319; ASP.NET版本:4.6.114.0

更新:我使用以下PowerShell脚本来测试POST方法:

$body = @{
    Id = 1;
    Name = "Blah blah blah";
} | ConvertTo-Json -Compress


$response = Invoke-WebRequest `
    -Method POST `
    -Uri "https://localhost/MyModel/FooDTOs/" `
    -ContentType "application/json" `
    -Body $body

0 个答案:

没有答案