在Web API 2中找不到方法

埃里克83

我试图弄清楚如何使用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方法,您要声明一个route参数,但是它永远不会作为路由的一部分发送,它是一个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}从“路由”模板中删除该模板。

希望这可以帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Web API 2中找不到方法

来自分类Dev

找不到Web API路由?

来自分类Dev

基于 Owin 的身份验证 - 在 web api 中找不到“配置”方法

来自分类Dev

Web API找不到Get方法-500错误

来自分类Dev

Web API 2路由-找不到资源

来自分类Dev

找不到ASP.NET Web API 2属性路由

来自分类Dev

Web API中的C#在HttpPost上找不到404

来自分类Dev

Web Api 404错误找不到资源

来自分类Dev

找不到Web API路由404

来自分类Dev

Web API POST-找不到404

来自分类Dev

在Azure API管理中找不到Azure App Service托管的Web API

来自分类Dev

找不到ASP.NET Web-API Ajax调用404方法

来自分类Dev

为什么找不到返回404的此Web API 2操作?

来自分类Dev

Gradle构建失败:在根项目'spotify-web-api-android'中找不到任务'jar'

来自分类Dev

在ASP.NET Web API应用程序中找不到JSON类型

来自分类Dev

为什么在ASP.NET Web API中找不到我的POST操作?

来自分类Dev

URL中不存在可选参数时,找不到Web API操作

来自分类Dev

在asp.net Web API中找不到HTTP自定义异常

来自分类Dev

通过属性路由找不到子文件夹中的Web API控制器

来自分类Dev

我正在尝试从ajax调用中调用由我编写的Web api Post方法(即PostMedication),它给我错误“找不到资源”。

来自分类Dev

WEB API ODATA错误“找不到与请求匹配的HTTP资源”

来自分类Dev

找不到ASP.NET Web API资源错误

来自分类Dev

发布.Net Framework Web API时找不到XML文档?

来自分类Dev

Web Api <T>方法

来自分类Dev

调用Web API方法

来自分类Dev

Web Api <T>方法

来自分类Dev

Web API 2缓存

来自分类Dev

Web Api中的路由

来自分类Dev

Web API中的路由