【问题标题】:Way to debug request to Web API controller调试对 Web API 控制器的请求的方法
【发布时间】:2015-02-03 16:21:49
【问题描述】:

我有一个简单的控制台应用程序,它将 json 数据发送到控制器。

Client.PostAsJsonAsync("http://[site].azurewebsites.net/api/Decision", report);

和控制器:

public class DecisionController : ApiController
{
    private readonly TaskManager _taskManager = new TaskManager();
    [HttpGet]
    public Decision Get(int id)
    {
        return _taskManager.GetDecision(id);
    }
    [HttpPost]
    public void Post(Decision decision)
    {
        _taskManager.UpdateDecision(decision);
    }
}

Visual Studio 调试器显示,请求未到达控制器(未触发断点)。控制台应用程序不会抛出任何异常,并且报告变量不等于 null。

如何调试?

【问题讨论】:

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


    【解决方案1】:

    您可能想看看Fiddler,它是一个调试网络请求的免费工具。基本上,它会监控通过您的机器的所有 Web 请求,并让您查看它们的样子。您也可以直接从那里生成新的。这样,您至少可以确保您的请求格式正确。

    另外,我注意到你试图直接调用你的控制器,而你应该在你的控制器上调用一个动作。当您请求GET api/Decision 时,您还需要提供一个操作方法。我对您的模型了解得不够多,无法正确重构您的控制器,但这里有一个基于简单用户配置文件的示例。

    public class ProfileController : ApiController
    {
        [HttpGet]
        public string FullName()
        {
            return "Foo Bar";
        }
    
        [HttpPost]
        public void FullName(string newName)
        {
            // ...
        }
    
        [HttpGet]
        public int Age()
        {
            return 22;
        }
    
        [HttpPost]
        public void Age(int newAge)
        {
            // ...
        }
    }
    

    如您所见,HttpVERB 属性不用于将请求分派到控制器的特定方法。它用于区分相关restful动作的不同重载。在这种情况下,它用于区分获取和设置 FullName 和 Age 属性。

    如果您要保持控制器完好无损,您应该要求:

    • POST http://[site].azurewebsites.net/api/Decision/post
    • GET http://[site].azurewebsites.net/api/Decision/get

    【讨论】:

    • Fiddler 显示,该 json 正确编译并包含在请求中。
    • 我看到你有两种方法,但你的请求没有指定任何方法。格式应为domain/site/controller/method。要像现在一样调用您的代码,您需要将您的请求发送到http://[site].azurewebsites.net/api/Decision/gethttp://[site].azurewebsites.net/api/Decision/post。显然,这并不平静,因此您可能需要改进控制器结构。
    • 据我所知,asp.net可以根据请求的类型(例如post)选择合适的方法。我已经标记了方法属性 [HttpPost]。
    • 它可以区分重载,但它不知道在控制器内部调用哪些方法。您可以在同一个控制器中使用多个标有 HttpGet 的方法。例如,您可以在 HttpPost 中拥有一个带有 SignIn 和 SignUp 方法的 Auth 控制器。
    • 只是一个简单的问题,你是如何调试你的应用程序的?如果您在本地调试,则必须更新端点以指向在您的机器上运行的 iisexpress 的本地实例。如果要在 azure 服务器上进行远程调试,则需要按照以下说明进行操作:blogs.msdn.com/b/webdev/archive/2013/11/05/…
    猜你喜欢
    • 2013-11-19
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    相关资源
    最近更新 更多