WEBApi 2.0 PUT не поддерживается REACT - PullRequest
0 голосов
/ 18 января 2020

Я разрабатываю intr anet API для использования с сайтом REACT. GET работает нормально, и теперь я пытаюсь разработать сообщение, но я продолжаю получать сообщение «Запрашиваемый ресурс не поддерживает http-метод« PUT »». от почтальона. Я просмотрел множество сайтов и страниц по этому вопросу и перепробовал все, что смог найти, вплоть до поиска файлов Machine.config и Web.config по умолчанию. Я удалил все ссылки на WebDav и добавил глагол во все сегменты системы, которые я могу найти.

Я использую IIS 7.5 на Windows 7 с VS2019 и. Net 4.7.2.

Вот мой web.config:

<system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
      </customHeaders>
    </httpProtocol>
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <remove name="WebDAVModule" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET, POST, PUT, DELETE, DEBUG, OPTIONS" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>

  </system.webServer>

и мой контроллер:

 // PUT api/<controller>/5
        [System.Web.Http.HttpPut]
        [Route("MyEndPoint")]
        public void Put(int id, [FromBody]object val)
        {
//tried also passing in JObject value as a parameter
            var value = new JObject(val);
            var CaseNum = value["CaseNum"].ToString();
            var LastName = value["LastName"].ToString();
            var FirstName = value["FirstName"].ToString();
            var MiddleInitial = value["MiddleInitial"].ToString();
            var FinNum = value["FinNum"].ToString();
            var TransitNum = value["TransitNum"].ToString();
            var AccountNum = value["AccountNum"].ToString();

//... more code here once I can hit the function

и, наконец, моя начальная конфигурация для маршрутизации:

 public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            var config = new HttpConfiguration();

            config.MapHttpAttributeRoutes();
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "dataAPI/{controller}/{function}",
                defaults: new { function = RouteParameter.Optional }
            );
            config.Formatters.Remove(config.Formatters.XmlFormatter);
            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc;

            app.UseWebApi(config);
        }
    }
}

******************************РЕДАКТИРОВАТЬ******************* ************ Добавление в код React выполнения вызова пут

export const SomeMethod_Update = (rowId, rowData) => (dispatch) => {
    dispatch(Actions.SomeMethodLoading());
    //var data={row: rowId, data: rowData};

    fetchInit.method = "PUT";
    fetchInit.body = JSON.stringify(rowData);
    var myReq = new Request('/dataAPI/SomeMethod/' + rowId, fetchInit);

    return fetch(myReq)
        .then(response => {
            if (response.ok) {
                return response;
            }
            else {
                var error = new Error("Error " + response.statusText);
                error.response = response;
                throw error;
            }
        }, error => {
            var err = new Error(error.message);
            throw err;
        })
        .then(response => response.json())
        .then(SomeMethod => {
            if (SomeMethod !== "false")
                dispatch(Actions.SomeMethodLoaded(SomeMethod))
            else
                CurrentPage_Update({ componentId: 'NotAllowed' });
        })
        .catch((err) => dispatch(Actions.SomeMethodFailed(err.message)));

}

Первоначально я не вставлял это, потому что получал ту же проблему от Почтальона. Вот пример JSON, который я отправляю на случай, если это поможет:

[
    {
        "id": 226,
        "Case Number": 172524,
        "Last Name": "lastName",
        "First Name": "firstName",
        "Initials": "",
        "Bank #": "000       ",
        "Transit #": "12345             ",
        "Account #": "111111111         "
    }
]
...