Javascript 使用ajax调用异步web api方法

Javascript 使用ajax调用异步web api方法,javascript,c#,api,Javascript,C#,Api,如何使用jquery ajax调用异步web api方法 JavaScript代码: var serviceUrl = 'http://localhost:4770/api/values'; $.ajax({ type: "GET", url: serviceUrl, data: {},

如何使用jquery ajax调用异步web api方法

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#代码:

C#代码成功执行,但ajax不起作用。
我的API代码: Web API配置文件代码:

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))));
        }
    }
公共静态类WebApiConfig
{
公共静态无效寄存器(HttpConfiguration配置)
{
config.EnableCors();
config.SuppressDefaultHostAuthentication();
添加(新的HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
config.Formatters.XmlFormatter.UseXmlSerializer=true;
GlobalConfiguration.Configuration.MessageHandlers.Add(新MessageLoggingHandler());
//Web API路由
config.maphttpAttribute路由();
config.Routes.MapHttpRoute(
名称:“DefaultApi”,
routeTemplate:“api/{controller}/{id}”,
默认值:新建{id=RouteParameter.Optional}
);
}
}
公共抽象类MessageHandler:DelegatingHandler
{
受保护的覆盖异步任务SendAsync(HttpRequestMessage请求,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=wait request.Content.ReadAsByteArrayAsync();
等待输入异步消息(corrId、requestInfo、requestMessage);
var response=await base.sendaync(请求、取消令牌);
字节[]响应消息;
if(响应。IsSuccessStatusCode)
responseMessage=wait response.Content.ReadAsByteArrayAsync();
其他的
responseMessage=Encoding.UTF8.GetBytes(response.ReasonPhrase);
等待OutgoingMessageAsync(corrId、requestInfo、responseMessage);
返回响应;
}
受保护的抽象任务incommmingmessageasync(字符串correlationId、字符串requestInfo、字节[]消息);
受保护的抽象任务OutgoingMessageAsync(字符串correlationId、字符串requestInfo、字节[]消息);
}
公共类MessageLoggingHandler:MessageHandler
{
受保护的重写异步任务incommmingmessageasync(字符串correlationId,字符串requestInfo,字节[]消息)
{
wait Task.Run(()=>Debug.WriteLine(string.Format(“应用程序跟踪:{0}-请求:{1}\r\n{2}”),correlationId,requestInfo,Encoding.UTF8.GetString(message));
}
受保护的覆盖异步任务OutgoingMessageAsync(字符串correlationId、字符串requestInfo、字节[]消息)
{
wait Task.Run(()=>Debug.WriteLine(string.Format(“应用程序跟踪:{0}-响应:{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);
        }
    }
[使能CORS(来源:“*”,标题:“*”,方法:“*”)
[异名]
公共类值控制器:ApiController
{
public IHttpActionResult Get()
{
返回新的DataManager().GetUser();
}
}
公共类数据管理器
{
公共IHttpActionResult GetUser()
{
var x=“哈呵呵”;
返回新的HttpActionResult(HttpStatusCode.OK,x);
}
}
公共类HttpActionResult:IHttpActionResult
{
私有只读字符串\u消息;
私有只读HttpStatusCode\u statusCode;
公共HttpActionResult(HttpStatusCode状态码,字符串消息)
{
_statusCode=statusCode;
_消息=消息;
}
公共任务执行同步(CancellationToken CancellationToken)
{
var响应=新的HttpResponseMessage(_statusCode)
{
Content=新的StringContent(\u消息)
};
返回Task.FromResult(响应);
}
}
任何人都可以帮助我。我尽我最大的努力,但我做不到。我失去了几天的工作,但我找不到任何解决方案。

因为您使用的是“async:false”,所以这可能会起作用:

 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")

当我使用这个config.Formatters.XmlFormatter.UseXmlSerializer=true;在webapi.config中,它会自动转换为xml。@SumonBanerjee-Hi。我知道。在这种情况下,您有一个作为字符串数据类型发送给您的XML文档。如果需要在javascript中将其视为XMLDocument,则应将其转换;如果您没有,那么您有和字符串数据类型,其中的内容是XML…不管怎样,它工作了吗?async:false帮助解决了这个问题…谢谢
return ( new window.DOMParser() ).parseFromString(resp, "text/xml")