2013-04-02 292 views
0

这是我的jQuery代码来调用网页APIGET方法405不允许

var request = { 
    RequestId: "123", 
    DeviceId: "ACU-B2-01-R1", 
    AccessType: "Unlock", 
    LoginId: "tester", 
    Password: "tester" 
}; 

$.ajax({ 
    url: 'http://localhost:55208/api/accesspanel', 
    type: 'POST', 
    data: JSON.stringify(request), 
    dataType: 'jsonp', 
    contentType: "application/json;charset=utf-8", 
    success: function (data) { 
     alert("success"); 
     alert(JSON.stringify(data)); 
    }, 
    error: function (x, y, z) { 
     alert(x + '\n' + y + '\n' + z); 
    } 
}); 

当我运行这段代码,什么都不会发生。成功和错误块都不会被解雇。在铬的调试控制台检查之后,这是错误记录:

GET http://localhost:55208/api/accesspanel?callback=jQuery18203847100134007633_…22,%22LoginId%22:%22tester%22,%22Password%22:%22tester%22}&_=1364916423737 405 (Method Not Allowed) 
    send jquery.min.js:2 
    p.extend.ajax jquery.min.js:2 
    (anonymous function) 

我,不过,能叫我的网络API方法成功地使用C#代码,它看起来像这样:

using (var client = new HttpClient()) 
    { 
     client.BaseAddress = new Uri("http://localhost:55208/"); 

     var request = new DeviceAccessRequest 
     { 
      RequestId = Guid.NewGuid().ToString(), 
      DeviceId = "ACU/B2/01/R1", 
      AccessType ="Unlock", 
      LoginId = "tester", 
      Password = "tester" ,      
     }; 
     var response = client.PostAsJsonAsync("api/accesspanel", request).Result; 
     if (response.IsSuccessStatusCode) 
     { 
      var deviceAccessResponse = response.Content.ReadAsAsync<DeviceAccessResponse>().Result; 

     } 
    } 

这是我的web API方法:

[HttpPost] 
    public HttpResponseMessage PostDeviceControl(DeviceAccessRequest deviceAccessRequest) 
    { 

     var deviceAccessResponse = new DeviceAccessResponse(deviceAccessRequest.RequestId) 
      { 
       Status = "OK" 
      }; 
     var response = Request.CreateResponse<DeviceAccessResponse>(HttpStatusCode.OK, deviceAccessResponse); 
     return response; 
    } 

回答

1

你看到在控制台GET请求的原因是因为你指定dataType: 'jsonp'只用GET请求的作品(REA的儿子是因为jQuery将其转换为指向您指定的url的<script>标签)。如果您希望使用GET以外的其他动词进行跨域AJAX,则无法使用JSONP。如果您需要使用其他动词(如POST),您有两种选择:

  • CORS。看看following video,它说明了如何在Web API上启用CORS。很明显,为了这个工作你的客户端浏览器需要TIO支持它
  • 您的域上的服务器端网桥。这里的想法是在托管你的JavaScript代码的域上有一些服务器端脚本,它将把HTTP请求发送到API并将响应返回给客户端。然后你会发送一个常规的AJAX POST请求到你自己的域名