Метод сообщения контроллера Api возвращает 404 - не найдено - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть эти методы контроллера в моем веб-API, оба они принимают HttpPost. Метод Process () получает параметр сложного типа в теле. Метод Install получает строковый параметр в теле. Метод Process вызывается успешно, но метод Install завершается неудачно с ошибкой 404 - не найден, я предполагаю, что маршрутизация не удалась, но я просто не могу понять, что я делаю неправильно ...

        [HttpPost]
        [ResponseType(typeof(IProcessableObject))]
        [Route("Workflow/Process")]
        public IHttpActionResult Process([FromBody]SerializedObject request)
        {
            try
            {
                Type objectType = ResolveType(request.ObjectType);
                IProcessableObject obj = (IProcessableObject)JsonSerializer.Deserialize(request.RawObject, objectType);
                log.DebugFormat("Processing {0} with workflow {1}", objectType.Name, obj.WorkflowId);
                var workflow = workflowController.Get(obj.WorkflowId, true);
                var workflowProcessor = new WorkflowProcessor(obj, workflow);
                if (workflowProcessor.Process())
                    return Ok(obj);
                return InternalServerError();
            }
            catch (Exception ex)
            {
                log.Error(string.Format("Failed processing object {0}", request.ObjectType), ex);
                return InternalServerError();
            }
        }

        [HttpPost]
        [ResponseType(typeof(int))]
        [Route("Workflow/Install/{userName}")]
        public IHttpActionResult Install(string userName, [FromBody]string xmlTemplate)
        {
            try
            {
                log.DebugFormat("User {0} is installing new workflow:{1}{2}", userName, Environment.NewLine, xmlTemplate);
                var wf = workflowController.Install(xmlTemplate, userName);
                if (wf == null)
                    return BadRequest();
                return Ok(wf.WorkflowId);
            }
            catch (Exception ex)
            {
                log.Error("Failed installing workflow", ex);
                return InternalServerError();
            }
        }

И из моего приложения MVC я называю их так:

        public static IProcessableObject Process(IProcessableObject obj, bool isProxy = false)
        {

            string requestURL = string.Concat(wfServiceUrl, "Workflow/Process");
            var requestData = new SerializedObject
            {
                RawObject = JsonSerializer.Serialize(obj),
                ObjectType = isProxy ? obj.GetType().BaseType.AssemblyQualifiedName : obj.GetType().AssemblyQualifiedName
            };

            using (var client = new WebClient())
            {
                client.Headers[HttpRequestHeader.ContentType] = "application/json";

                var result = client.UploadString(requestURL, JsonSerializer.Serialize(requestData));
                return (IProcessableObject)JsonSerializer.Deserialize(result, isProxy ? obj.GetType().BaseType : obj.GetType());
            }
        }

        public static int Install(string workflowTemplate, string userName)
        {
            string requestURL = string.Concat(wfServiceUrl, "Workflow/Install/", userName);


            using (var client = new WebClient())
            {
                client.Headers[HttpRequestHeader.ContentType] = "application/json";

                var result = client.UploadString(requestURL, JsonSerializer.Serialize(workflowTemplate));
                return JsonSerializer.Deserialize<int>(result);
            }
        }



public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
        }
    }

1 Ответ

0 голосов
/ 15 ноября 2018

Попробуйте изменить это:

[Маршрут ("Рабочий процесс / Установка / {имя пользователя}")]

Для этого:

[Маршрут ("API / Workflow /Установите / {userName} ")]

И проделайте то же самое с другими маршрутами, добавьте api / , и это должно сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...