2014-01-25 3 views
1

Я не могу разместить строку в WebAPI из консольного приложения:Сообщение от консольного приложения к WebAPI

Console App:

public void Main() 
{ 
    try 
    { 
     ProcessData().Wait(); 
    } 
    catch (Exception e) 
    { 
     logger.Log(LogLevel.Info, e); 
    } 
} 

private static async Task ProcessData() 
{ 
    try 
    { 
     using (var client = new HttpClient()) 
     { 
      client.BaseAddress = new Uri(API_BASE_URL); 
      client.DefaultRequestHeaders.Accept.Clear(); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

      // HTTP POST 
      var response = await client.PostAsJsonAsync("api/teste", "test_api"); 
     } 
    } 
    catch (Exception e) 
    { 
     logger.Log(LogLevel.Info, e); 
    } 

я пытаюсь вызвать WebAPI в веб-приложения MVC4 :

namespace Heelp.Api 
{ 
    public class TesteController : ApiController 
    { 
     private readonly ICommentService _commentService; 

     public TesteController(ICommentService commentService) 
     { 
      _commentService = commentService; 
     } 

     public string Post(string comment) 
     { 
      var response = "OK"; 

      try 
      { 
       _commentService.Create(new Core.DtoModels.CommentDto { CommentType = "Like", Email = "[email protected]", Message = "comment" }); 
      } 
      catch(Exception e) 
      { 
       response = e.Message; 
      } 

      return response; 
     } 
    } 
} 

[EDIT]

После тестирования с стелькой, я получаю ошибку:

{"Message":"An error has occurred.","ExceptionMessage":"Type 'Heelp.Api.TesteController' does not have a default onstructor", 
    "ExceptionType":"System.ArgumentException","StackTrace":" 
     at System.Linq.Expressions.Expression.New(Type type)\r\n at 
     System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)\r\n at 
     System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, 
     HttpControllerDescriptor controllerDescriptor, Type controllerType)"} 

The Route is the Default. 

Я не знаю, как его отладить, и почему он не работает.

Что я здесь делаю неправильно?

+1

Используйте Visual Studio для отладки части кода сервера и клиента. Используйте Fiddler, чтобы проверить, что отправлено по сети.Затем, когда вы локализировали свою проблему, обновите сообщение (например, сообщения об ошибках, где вы видите неожиданное поведение и т. Д.). –

+0

Я не думаю, что вы правильно формируете свой звонок. Строка - это одно, а JSON - другое. Вы не публикуете JSON, а действуете так, как если бы делали. Используйте client.PostAsync и удалите заголовки, связанные с JSON. –

+0

Привет, я поставил ошибку, которую я получаю от fiddler. – Patrick

ответ

1

Вот мой ответ. У веб-API всегда была эта проблема с простыми типами. Читать Rick Strahls Blog Post on Web API problems with Simple Data Types

Что вы можете сделать это, есть WEB-код API таким образом -

public HttpResponseMessage Post(FormDataCollection formData) 
{ 
    return null; 
} 

И пусть HttpClient запрос таким образом -

HttpClient client = new HttpClient(); 
    var nameValues = new Dictionary<string, string>(); 
    nameValues.Add("Name", "hi"); 
    var Name = new FormUrlEncodedContent(nameValues); 
    client.PostAsync("http://localhost:23133/api/values", Name).ContinueWith(task => 
    { 
     var responseNew = task.Result; 
     Console.WriteLine(responseNew.Content.ReadAsStringAsync().Result); 
    }); 

, что даст выход следующим образом - enter image description here

[--- EDIT, основанный на вопросе редактирования ---]

Я проверил последние изменения по вопросу и Ошибка из-за отсутствия конструктора по умолчанию. Эта ошибка возникает из-за того, что у вас что-то не так с Dependency Injection, которое вы делаете для инъекции конструктора. Поэтому, пожалуйста, проверьте эту область. Также используйте Unity Web API Dependency Injection nuget, чтобы выполнить эту работу. Here goes complete tutorial in setting up DI using Unity.

Также, пожалуйста, проверьте autofac, если вам нужны разные версии из MVC и Web Api, но, по крайней мере, это относится к Unity. Я думаю, вам нужно иметь Autofac.WebApi 3.1.0 для DI для работы с контроллерами Web API.

+0

Привет, пожалуйста, проверьте ошибку, которую я получаю от скрипача. Спасибо. – Patrick

+0

@Patrick. Правильно ли вы настроили свой Inject IoC. Из-за этого возникает ошибка. Существует специальный Unity IoC nuget Web API, пожалуйста, используйте его. – ramiramilu

+0

У меня уже установлен и настроен Autofac в этом проекте. Другие контроллеры точно такие же, поэтому я не понимаю, почему ApiController не работает, мне нужно сделать что-то особенное в Autofac IoC, чтобы решить эту проблему? Если я удалю контроллер, я могу вызвать метод без каких-либо проблем. – Patrick

0

Прежде всего, спасибо за помощь.

Проблема заключалась в том, что в проекте MVC4, где я добавляю Api, я уже использовал Autofac для Injection Dependency, но я не знал, что мне также нужен DI для ApiControllers.

Так я установил с помощью NuGet Autofac.WebApi 3.1.0 и добавить к Autofac Config строки:

В Бегин:

builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 

В конце концов:

GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container); 

Теперь все работает нормально! :)

Смежные вопросы