Я полностью застрял после того, как увидел, что мой метод POST возвращает 400 Bad Request. Странно то, что они отлично работали на Local. Когда я публикую свой проект API и развертываю его на нашем тестовом сервере, методы POST перестают работать.
Это мой web.config
файл:
<configuration>
<configSections>
<section name="entityFramework"
type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<appSettings></appSettings>
<system.web>
<compilation debug="true" targetFramework="4.6.1" />
<httpRuntime targetFramework="4.6.1" />
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule" /> <!-- In order to fix 405 Error on Put method -->
</modules>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*."
verb="GET,HEAD,POST,DEBUG,PUT,DELETE"
type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<!--<security>
<requestFiltering>
<verbs>
<add verb="GET" allowed="true" />
<add verb="POST" allowed="true" />
<add verb="PUT" allowed="true" />
<add verb="DELETE" allowed="true" />
</verbs>
</requestFiltering>
</security>-->
</system.webServer>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json"
publicKeyToken="30ad4fe6b2a6aeed" />
<bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-5.2.4.0" newVersion="5.2.4.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.4.0" newVersion="5.2.4.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.6.0" newVersion="5.2.6.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.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /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.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+" />
</compilers>
</system.codedom>
<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>
<connectionStrings>
<add name="XDataContext" connectionString="data source=XXX.XXX.XX.XX;initial catalog=X;user id=X;password=X;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
Я пробовал предлагаемые решения здесь Служба WCF, размещенная на IIS, возвращает HTTP 400 Bad Request и здесь ASP.NET Web API 400 Неверный запрос в запросе POST при развертывании на тестовом сервере , но, к сожалению, ни один из них не сработал в моем случае.
И последнее замечание: сообщение об ошибке в Fiddler также полностью пустое, когда я получаю эту ошибку.
{"Message":""}
Заранее спасибо!
ИЗМЕНИТЬ:
Я комментирую тег безопасности, так как они также не решили мою проблему.
ИЗМЕНИТЬ 2:
Ниже приведен метод, который возвращает неверный запрос на сервер, но отлично работает на локальном компьютере:
public HttpResponseMessage PostLogin(LoginWM loginWM)
{
try
{
if (_userTokenManager.CheckUser(loginWM))
{
_userTokenManager.SaveToken(loginWM.Email, loginWM.Password);
return Request.CreateResponse(HttpStatusCode.Created, _userTokenManager.PublishToken(loginWM.Email, loginWM.Password));
}
else
{
return Request.CreateErrorResponse(HttpStatusCode.NotFound, new Exception("User not found."));
}
}
catch (Exception ex)
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex.Message);
}
}
И то, что я отправляю (в формате JSON), выглядит следующим образом:
{"Email":"[email protected]","Password":"oa123"}
Вот класс, который я использовал для вышеуказанного JSON:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace XX.XX.Model.WebModel
{
public class LoginWM
{
[Required]
[StringLength(50)]
public string Email { get; set; }
[Required]
[StringLength(20)]
public string Password { get; set; }
}
LoginWM
. Кроме того, убедитесь, что строка подключения к базе данных действительна._userTokenManager
вводится в контроллер через конструктор? - person Mohsin Mehmood   schedule 11.07.2018public UserTokenController() { _userTokenManager = new UserTokenManager(); }
- person RaZzLe   schedule 11.07.2018return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex.ToString());
измененаex.Message
на ex.ToString() - person Mohsin Mehmood   schedule 11.07.2018IDX12401: Expires: '[PII is hidden]' must be after NotBefore: '[PII is hidden]'
Этот контроллер выдает Json Web Token при нормальных обстоятельствах. Я искал этотIDX12401
и видел связанные с ним проблемы JWT. буду копать дальше - person RaZzLe   schedule 11.07.2018UserTokenManager
класс взаимодействует с базой данных и проверяет пользователя? Я снова рекомендую проверить строку подключения к базе данных и убедиться, что вы можете подключиться к серверу базы данных с вашего тестового сервера, используя учетные данные, указанные в вашем web.config. - person Mohsin Mehmood   schedule 12.07.2018