Почтовый запрос возвращает 400 Bad Request после публикации

Я полностью застрял после того, как увидел, что мой метод 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=\&quot;Web\&quot; /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; }
}

person RaZzLe    schedule 11.07.2018    source источник
comment
Регистрируете ли вы исключения, ошибки и т. д. на сервере? Возможно, вы захотите проверить файлы журнала, если они есть.   -  person Rui Jarimba    schedule 11.07.2018
comment
Не могли бы вы опубликовать конкретный пример? например Полезная нагрузка, которую вы пытаетесь отправить POST, и метод, который должен отвечать на этот POST. Спасибо !   -  person Christos    schedule 11.07.2018
comment
@Christos Я поделился примером   -  person RaZzLe    schedule 11.07.2018
comment
@RaZzLe Также поделитесь кодом класса LoginWM. Кроме того, убедитесь, что строка подключения к базе данных действительна. _userTokenManager вводится в контроллер через конструктор?   -  person Mohsin Mehmood    schedule 11.07.2018
comment
@MohsinMehmood Теперь я тоже делюсь классом LoginWM. Говоря, убедитесь, что строка соединения базы данных действительна, вы имеете в виду часть ‹connectionStrings› в моем Web.config? Если это так, я уверен, что он отлично работает на Local. И о вашем последнем вопросе, да, он вводится через метод конструктора public UserTokenController() { _userTokenManager = new UserTokenManager(); }   -  person RaZzLe    schedule 11.07.2018
comment
@RaZzLe Ваш тестовый сервер также подключается к тому же экземпляру сервера sql, который вы используете на своем локальном хосте? Кроме того, попробуйте изменить строку return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex.ToString()); изменена ex.Message на ex.ToString()   -  person Mohsin Mehmood    schedule 11.07.2018
comment
@MohsinMehmood Большое спасибо за напоминание об этом изменении, по крайней мере, теперь я действительно вижу, в чем проблема. Он говорит IDX12401: Expires: '[PII is hidden]' must be after NotBefore: '[PII is hidden]' Этот контроллер выдает Json Web Token при нормальных обстоятельствах. Я искал этот IDX12401 и видел связанные с ним проблемы JWT. буду копать дальше   -  person RaZzLe    schedule 11.07.2018
comment
(Все еще не могу понять, почему он генерирует успешный токен на локальном, а не на тестовом сервере)   -  person RaZzLe    schedule 11.07.2018
comment
UserTokenManager класс взаимодействует с базой данных и проверяет пользователя? Я снова рекомендую проверить строку подключения к базе данных и убедиться, что вы можете подключиться к серверу базы данных с вашего тестового сервера, используя учетные данные, указанные в вашем web.config.   -  person Mohsin Mehmood    schedule 12.07.2018