簡體   English   中英

Web API 2中找不到的方法

[英]Method not found in Web API 2

我試圖弄清楚如何使用Web API。 我已經完成了一些教程,現在我正在嘗試設置我的Web服務。 我很難弄清楚為什么它找不到我的方法。 對我來說它似乎是隨機的(教程工作正常)。 在我的實驗期間,有時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。

GET方法的問題

對於HTTP Get方法,路由存在問題。

您已將GET路由聲明為:

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

但是然后方法參數聲明為:

 public IHttpActionResult GetContentFiles(int count)

使用基於屬性的路由時,參數名稱必須匹配。

我對您的代碼進行了非常簡單的再現(顯然我沒有您的類,但基礎結構將是相同的)

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

因此,簡單的解決方法是從Route模板中刪除{files}

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM