【问题标题】:Method not found in Web API 2在 Web API 2 中找不到方法
【发布时间】:2015-06-11 08:19:08
【问题描述】:

我想弄清楚如何使用 Web API。我已经阅读了一些教程,现在我正在尝试设置我的网络服务。 我很难弄清楚为什么它找不到我的方法。对我来说,这似乎是随机的(教程运行良好)。 在我的实验中,有时 get 方法会返回“方法不允许”。

这是我的服务:

public class ContentFilesController : ApiController
{
  [Route("api/contentfile/{id}")]
    [HttpGet]
    public IHttpActionResult GetContentFiles(int count)
    {
        if (_contentFiles == null)
            GenerateContentFileList();
        List<ContentFile> files = new List<ContentFile>();
        int i = 0;
        while(true)
        {
            ContentFile cf = _contentFiles[i];
            if(!_filesOutForProcessing.Contains(cf))
            {
                files.Add(cf);
                i++;
            }
            if (i == count)
                break;
        }
        return Ok(files);
    }
    [HttpPost]
    [Route("api/contentfile/{files}")]
    public IHttpActionResult Post([FromBody] List<ContentFile> files)
    {
        return Ok();
    }

}

编辑: 这是我用来调用服务的代码:

static async Task TestAsync()        {
        using (var client = new HttpClient())            {
            client.BaseAddress = new Uri("http://localhost:46015/");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            HttpResponseMessage response = await client.GetAsync("api/contentfile/1");
            if (response.IsSuccessStatusCode)
            {
                var contentfiles = await response.Content.ReadAsAsync<List<ContentFile>>();                    
            }
        }
    }

    static async Task ReportTest()
    {
        List<ContentFile> files = new List<ContentFile>()
        {
            new ContentFile(){Path="hej"},
            new ContentFile(){Path="då"}
        };

        using(var client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://localhost:46015");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            HttpResponseMessage response = await client.PostAsJsonAsync<List<ContentFile>>("api/contentfile", files);
            if(response.IsSuccessStatusCode)
            {

            }
        }
    }

你从哪里开始寻找? 我在这里疯了。

谢谢!

编辑:澄清错误,两种客户端方法的问题是 HttpResponseMessage 有 response.IsSuccessStatusCode false 和 StatusCode = MethodNotAllowed 或 MethodNotFound。

【问题讨论】:

  • 把代码表单放到你调用这个 API 的地方
  • 我无法同时发布客户端代码。发帖时出现错误。但基本上这是我的客户端代码:
  • 仍然没有代码!
  • 您的客户端代码是否在同一个域上运行(我的意思是,同一个主机,同一个端口 - 通常这意味着您为 WebAPI 和 HTML 前端使用同一个项目)。如果不是,那么这可能是 CORS 问题 - 特别是因为您提到了 405 不允许的错误。
  • 抱歉,发帖很困难,我一直收到“发帖时出错”

标签: c# rest asp.net-web-api


【解决方案1】:

GET 方法的问题

对于HTTP Get方法,你的路由有问题。

您已将 GET 路由声明为:

[Route("api/contentfile/{id}")]

但随后方法参数被声明为:

 public IHttpActionResult GetContentFiles(int count)

当使用基于属性的路由时,参数names必须匹配。

我对你的代码做了一个非常简单的复制(显然我没有你的类,但基础设施是一样的)

在 WebAPI 项目中

public class ContentFile
    {
        public int ID { get; set; }
    }

    public class ContentFilesController : ApiController
    {
        [Route("api/contentfile/{count}")] //this one works
        [Route("api/contentfile/{id}")] //this one does not work
        [HttpGet]
        public IHttpActionResult GetContentFiles(int count)
        {
            var files = new List<ContentFile>();
            for (int x = 0; x < count; x++)
            {
                files.Add(new ContentFile(){ID=x});
            }

            return Ok(files);
        }
    }

在客户端项目中

public class ContentFile
    {
        public int ID { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri("http://localhost:51518/");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                HttpResponseMessage response = client.GetAsync("api/contentfile/1").Result;
                var data = response.Content.ReadAsStringAsync().Result;
                Console.WriteLine(data);
                Console.ReadKey();
            }
        }
    }

所以代码与您的代码并不完全相同,但几乎是相同的代码。运行WebAPI项目然后客户端给我:

[{"ID":0}]

POST 方法的问题

POST 方法的情况下,您声明了一个路由参数,但它永远不会作为路由的一部分发送,它是一个 POST 正文:

[HttpPost]
[Route("api/contentfile/{files}")] //{files} here tells routing to look for a parameter in the *Route* e.g api/contentfile/something
public IHttpActionResult Post([FromBody] List<ContentFile> files)

所以简单的解决方法是从路由模板中删除{files}

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 2014-03-22
    • 2016-11-27
    • 2018-11-11
    • 1970-01-01
    • 2015-01-08
    相关资源
    最近更新 更多