Javascript 使用ajax调用异步web api方法
如何使用jquery ajax调用异步web api方法 JavaScript代码: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: {},
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")