2016-02-14 2 views
2

Как я могу вызвать метод async web api с помощью jquery ajax?Вызвать метод async web api с помощью ajax

JavaScript код:

var serviceUrl = 'http://localhost:4770/api/values'; 
        $.ajax({ 
         type: "GET", 
         url: serviceUrl, 
         data: {}, 
         async:false, 
         contentType: "text/xml", 
         dataType: "xml",     
         success: function (data) { 

         }, 
         error: function (data) { 

         } 
        }); 

C# Код:

using (var client = new HttpClient()) 
        { 
         var response = client.GetAsync("http://localhost:4770/api/values").Result; 
         var resultContent = response.Content.ReadAsStringAsync().Result; 

        } 

C# код выполнить успешно, но Ajax не работает.
Код моего API: Web API Conf. Код файла:

public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 

      config.EnableCors(); 

      config.SuppressDefaultHostAuthentication(); 
      config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 

      config.Formatters.XmlFormatter.UseXmlSerializer = true; 

      GlobalConfiguration.Configuration.MessageHandlers.Add(new MessageLoggingHandler()); 

      // Web API routes 
      config.MapHttpAttributeRoutes(); 

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


     } 
    } 

    public abstract class MessageHandler : DelegatingHandler 
    { 
     protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
     { 
      var corrId = string.Format("{0}{1}", DateTime.Now.Ticks, Thread.CurrentThread.ManagedThreadId); 
      var requestInfo = string.Format("{0} {1}", request.Method, request.RequestUri); 

      var requestMessage = await request.Content.ReadAsByteArrayAsync(); 


      await IncommingMessageAsync(corrId, requestInfo, requestMessage); 

      var response = await base.SendAsync(request, cancellationToken); 

      byte[] responseMessage; 

      if (response.IsSuccessStatusCode) 
       responseMessage = await response.Content.ReadAsByteArrayAsync(); 
      else 
       responseMessage = Encoding.UTF8.GetBytes(response.ReasonPhrase); 

      await OutgoingMessageAsync(corrId, requestInfo, responseMessage); 



      return response; 
     } 


     protected abstract Task IncommingMessageAsync(string correlationId, string requestInfo, byte[] message); 
     protected abstract Task OutgoingMessageAsync(string correlationId, string requestInfo, byte[] message); 
    } 



    public class MessageLoggingHandler : MessageHandler 
    { 
     protected override async Task IncommingMessageAsync(string correlationId, string requestInfo, byte[] message) 
     { 
      await Task.Run(() => Debug.WriteLine(string.Format("APP TRACING: {0} - Request: {1}\r\n{2}", correlationId, requestInfo, Encoding.UTF8.GetString(message)))); 
     } 


     protected override async Task OutgoingMessageAsync(string correlationId, string requestInfo, byte[] message) 
     { 
      await Task.Run(() => Debug.WriteLine(string.Format("APP TRACING: {0} - Response: {1}\r\n{2}", correlationId, requestInfo, Encoding.UTF8.GetString(message)))); 
     } 
    } 

API код контроллера:

[EnableCors(origins: "*", headers: "*", methods: "*")] 
    [AllowAnonymous] 
    public class ValuesController : ApiController 
    { 
     public IHttpActionResult Get() 
     { 
      return new DataManager().GetUser(); 
     } 


    } 


    public class DataManager 
    { 
     public IHttpActionResult GetUser() 
     { 
      var x = "HA HO HE"; 

      return new HttpActionResult(HttpStatusCode.OK, x); 

     } 
    } 

    public class HttpActionResult : IHttpActionResult 
    { 
     private readonly string _message; 
     private readonly HttpStatusCode _statusCode; 

     public HttpActionResult(HttpStatusCode statusCode, string message) 
     { 
      _statusCode = statusCode; 
      _message = message; 
     } 


     public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) 
     { 
      var response = new HttpResponseMessage(_statusCode) 
      { 
       Content = new StringContent(_message) 
      }; 
      return Task.FromResult(response); 
     } 
    } 

Пожалуйста, любой может помочь мне. Я пробую свой уровень лучше, но я не могу этого сделать. Я потерял пару дней, но я не могу найти решение.

ответ

0

Как вы используете «асинхронной ложь», вероятно, это будет работать:

var resp = $.ajax({ 
        type: "GET", 
        url: 'http://localhost:4770/api/values', 
        async:false, 
        contentType: "text/xml", 
        dataType: "xml" 
       }).responseText; 

С «responseText» является строкой, вы должны преобразовать его в XML:

return (new window.DOMParser()).parseFromString(resp, "text/xml") 
+0

Когда я использовать этот конфиг. Formatters.XmlFormatter.UseXmlSerializer = true; в webapi.config автоматически конвертируется в xml. –

+0

@SumonBanerjee Привет. Я знаю. В этой ситуации у вас есть XML-документ, который отправляется вам в виде строкового типа данных. Если вам нужно рассматривать его как XMLDocument в javascript, вы должны его преобразовать; Если вы этого не сделаете, у вас есть и строковый тип данных, который представляет собой XML. В любом случае, это сработало? – aminexplo

+0

Извините. Это не работа –

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