c# - 使用 Web Api Http Put 时出现内部服务器错误 500

标签 c# asp.net-web-api asp.net-web-api-routing

我正在为一家使用 Picking Process 的公司开发一个 Web 应用程序。

这个过程非常简单,我有一个包含一些信息的销售订单,我使用其中一些信息创建了一个提货 list (例如:商品数量、总重量和销售订单的 ID)。

我总是遇到这个错误

Internal Server Error

...当我尝试使用 PUT 方法时,创建一个挑选列表并将其添加到 Web Api 端的数据库中。

当我删除 [HttpPost] 时,错误更改为:

Method Not Found

Method Not Allowed

这是我的代码:

客户端

public async Task<bool> AddTarefa(ListasPicking listaPickingAdd) 
{
    String listaparaAdicionar = listaPickingAdd.idLista + ";" + listaPickingAdd.IDordemVenda + ";" + listaPickingAdd.peso + ";" + listaPickingAdd.itens;
    HttpResponseMessage response = await cliente.PutAsJsonAsync("api/ListasPicking/", listaparaAdicionar);

    return response.IsSuccessStatusCode;
}

Web Api 端 - Controller

//PUT: api/ListasPicking
[ResponseType(typeof (ListasPicking))]
[HttpPut]
public  IHttpActionResult PutLista ([FromBody] String lista)
{
    if(!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    String[] result = lista.Split(';');
    ListasPicking novaLista = new ListasPicking();
    novaLista.idLista=result[0];
    novaLista.IDordemVenda = result[1];
    string lista_peso_converttoDouble = result[2];
    novaLista.peso = Convert.ToDouble(lista_peso_converttoDouble);
    string lista_items_converttoInt = result[3];
    novaLista.itens = Convert.ToInt32(lista_items_converttoInt);

    primContext.ListasPickingGet.Add(novaLista);
    primContext.SaveChanges();

    return StatusCode(HttpStatusCode.Created);
}

我尝试了一些与此类问题相关的解决方案,但出现了相同的错误。

Web.config

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  https://go.microsoft.com/fwlink/?LinkId=301879
  -->
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="PrimaveraRest.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5.2" />
    <httpRuntime targetFramework="4.5.2" />
    <httpModules>
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" />
    </httpModules>
  </system.web>
  <system.webServer>
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
  <!--    <remove name="WebDAV"/> -->

      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
    <validation validateIntegratedModeConfiguration="false" />
    <modules>

     <!-- <remove name="WebDAVModule"/> -->
      <remove name="ApplicationInsightsWebTracking" />
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" />
    </modules>


  </system.webServer>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>
  <applicationSettings>
    <PrimaveraRest.Properties.Settings>
      <setting name="Company" serializeAs="String">
        <value>DEMO</value>
      </setting>
      <setting name="User" serializeAs="String">
        <value>adminfixe</value>
      </setting>
      <setting name="Password" serializeAs="String">
        <value>123456</value>
      </setting>
    </PrimaveraRest.Properties.Settings>
  </applicationSettings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>

更新

当我重建我的解决方案时,我得到了一些像这样的行:

Files\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets(1964,5): warning MSB3270: There was a mismatch between the processor architecture of the project being built "MSIL" and the processor architecture of the reference "Interop.ICrmDS800", "x86". This mismatch may cause runtime failures. Please consider changing the targeted processor architecture of your project through the Configuration Manager so as to align the processor architectures between your project and references, or take a dependency on references with a processor architecture that matches the targeted processor architecture of your project

可能是问题所在吗? Interop.dll 是我在项目中包含的一个文件,用于使用外部程序获取有关销售订单的信息。

解决方案

“ListaPicking”模型中缺少 [Key] 注释,并且我传递了一个具有默认值的 DateTime 变量...我只是更改为 DateTime.Today,现在它正在工作:)

最佳答案

您调用 PutAsJsonAsync 但当它需要表示 json 的字符串时,您传递一个非 json 字符串作为数据参数。

来自文档:

Sends a PUT request as an asynchronous operation to the specified Uri with the given value serialized as JSON.

要使其正常工作,请调用 PutAsync

关于c# - 使用 Web Api Http Put 时出现内部服务器错误 500,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44186436/

相关文章:

c# - 将当前身份验证凭据从 UWP 应用程序传递到 Web 服务,以使用这些凭据访问服务器上的资源

asp.net-web-api - 带有 swashbuckle 的 header 中的 API key

c# - WebApi 路由返回 Not Found in Orchard Module

c# - 返回接口(interface)但具体可能具有不在接口(interface)上的属性,我可以通过强制转换获得它们吗?

c# - 摆脱 C# XML 序列化中的数组名称

iis - 在 web.config 中添加 x-frame-Options 返回错误 500

c# - Web API 中的多个 GET 调用错误操作

c# - 405 方法不允许 - ASP.NET Web API

c# - 我可以在 ASP.Net Web API Controller 中使用多个 Get 方法吗

c# - 未生成的 Azure Functions C# 输入绑定(bind)是 function.json