1

我已经阅读了一些文章,详细介绍了如何将 JSONP 与 MVC4(我使用的是 RC 版本)和新的 Web Api 一起使用。我正在尝试执行跨域请求。我不知道我做错了什么。我的控制器继承自 MVC4 中的 ApiController 类。我尝试了 Rick Strahl 的实现和其他一些实现。这是我的示例方法:

public string StartTracking(string apiKey, DomainTracking domainTracking)
        {
            var user = _userService.GetByApiKey(apiKey);
            if(user != null)
            {
                var domain = user.Domains.FirstOrDefault(d => d.Name.ToLower() == domainTracking.Domain.Name.ToLower());

                if(domain != null)
                {
                    domainTracking.DomainId = domain.Id;
                    domainTracking.Domain = domain;

                    domainTracking.CreatedById = user.Id;
                    domainTracking.ModifiedById = user.Id;

                    var newDomainTracking = _domainTrackingService.Create(domainTracking);
                    return newDomainTracking.Id.ToString();
                }
            }
            else
            {
                throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
            }
            throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
        }

这是我的 Jquery 请求代码:

function getSessionKey() {

    var Domain = { 'Name': domainName };
    var DomainTracking = { 'Domain': Domain, 'FormElements': getFormElements(), 'ClientLocation': clientLocation };


    $.ajax({
        url: 'http://api.testdomain.com:4646/api/' + apiKey,
        type: 'GET',
        cache: false,
        timeout: 100000,
        data:  DomainTracking,
        dataType: "jsonp",
        error: function (xhr, status, error) {

        },
        success: function (data) {
            sessionKey =  data;
        }

    });
}

如果我将方法名称更改为 GetStartTracking,则会收到 500 错误。如果我保留名称 StartTracking,我会收到 405 not allowed 错误。我需要做什么?

4

2 回答 2

3

尝试使用“Get”作为方法的名称。JSONP 可能不适用于帖子,因此您的数据都必须在 url 中,我认为您不能使用 ajax 函数的 data 属性。

这可能会有所帮助

公共类 TrackingController : ApiController {

... public string Get (string apiKey, string Domain, string FormElements, string ClientLocation) {

//在这里做所有事情

}

}

并且请求的 URL 应该包含您的控制器的名称和 url 中的所有信息。可能还有其他方法可以做到这一点,但这应该可行。

http://api.testdomain.com:4646/api/跟踪/?apiKey=something&Domain=abc&FormElements=1,2,3&ClientLocaiton=somewhere

于 2012-08-14T16:01:59.913 回答
0

您可能缺少 jsonp 的 MediaTypeFormatter。

我已经为此创建了一个示例项目,它使用 Telerik Kendo UI 功能,但无论如何跨域过程都是相同的。您可以在此处下载示例应用程序:http ://www.kendoui.c​​om/code-library/mobile/listview.aspx 。

此外,您应该在 Api 方法前加上“Get”或将 [HttpGet] 属性添加到方法中。

我希望这有帮助。

于 2012-08-25T18:25:20.743 回答