当模型字符串具有带webapi的值时,PUT方法出错



我在这里有这个webapi方法:

// PUT api/Competitions/5
public HttpResponseMessage PutCompetitor(int id, CompetitionViewModel competitorviewmodel)
{
     ...
}

CompetitionViewModel看起来像这样:

public class CompetitionViewModel
{
    public int CompetitorId { get; set; }
    public string Owned{ get; set; }
    public bool Sold { get; set; }
}

我有一个有角度的http.put调用来更新一个竞争模型,它看起来像这样:

$scope.updateProject = function () {
    $http.put(mvc.base + "API/Projects/" + masterScopeTracker.ProjectID, $scope.ProjectCRUD)
        .success(function (result) {
        })
        .error(function (data, status, headers, config) {
            masterScopeTracker.autoSaveFail;
        });
}

页面加载时,会创建一个新的竞争。所以我有一个如下的模型:

{
    CompetitorId: 56,
    Owned: null,
    Sold: false
}

每15秒就会发出一个更新模型的电话。如果我不更改模型的任何值,就会调用webapi put方法并成功运行,不会出现任何问题。如果我将模型更改为:

{
    CompetitorId: 56,
    Owned: "Value",
    Sold: false
}

我得到一个500错误,该方法没有命中。不明白我在这里做错了什么。视图模型接受一个字符串。正在有效负载中发送字符串。然而我明白了错误。有人有什么想法吗?

更新:

我能够让服务器给我这个错误:

{"Message":"Anerrorhasoccurred.",
    "ExceptionMessage":"Objectreferencenotsettoaninstanceofanobject.",
    "ExceptionType":"System.NullReferenceException",
    "StackTrace":"atClientVisit.Models.ClientVisitEntities.SaveChanges()rnatClientVisit.Controllers.API.CompetitionsController.PutCompetitor(Int32id,CompetitionViewModelcompetitorviewmodel)rnatlambda_method(Closure,Object,Object[])rnatSystem.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass13.<GetExecutor>b__c(Objectinstance,Object[]methodParameters)rnatSystem.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Objectinstance,Object[]arguments)rnatSystem.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1func,CancellationTokencancellationToken)"
}

我还应该说,这种情况不会在当地发生。只有在客户端服务器上部署时才会发生这种情况。

您应该检查事件日志,看看服务器端的实际错误是什么。由于启用了WebDAV,我以前在使用Put时遇到过IIS/IIS Express问题。您可以在web.config中禁用它:

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule" />
    </modules>
    <handlers>
        <remove name="WebDAV" />
    </handlers>
</system.webServer>

最新更新