【问题标题】:ASP.NET Web API localhost:xxxx/api/product defaults to Home Page and not JSON data(orXML)ASP.NET Web API localhost:xxxx/api/product 默认为主页而不是 JSON 数据(或 XML)
【发布时间】:2019-01-02 18:00:06
【问题描述】:

我正在尝试通过 API 从 SQLEXPRESS 数据库中提取数据到我的客户端 UWP 应用程序。

这是我的代码(因此思考):

API 控制器:

[Route("api/product")]

public class ProductController : ApiController
{
    // GET: api/product
    [HttpGet]
    public ObservableCollection<Product> Get() 
    {
        string userId = "newuser"; //for testing only

        return Model.ReadAllSQLProducts(userId);
    }
}

型号:

// R part of CRUD
    public static ObservableCollection<Product> ReadAllSQLProducts(string userId)
    {
        var connString = "Server=localhost\\SQLEXPRESS;Integrated Security = SSPI; database = myDbName";
        string cmdText = "Select * FROM Product WHERE CONVERT(VARCHAR, UserId) = @userId;";
        using (var sqlConnection = new SqlConnection(connString))
        {
            using (var sqlCmd = new SqlCommand(cmdText, sqlConnection))
            {
                List<Product> SQLProductList = new List<Product>();

                sqlConnection.Open();

                SqlParameter param = new SqlParameter();
                param.ParameterName = "@userId";
                param.Value = userId;
                sqlCmd.Parameters.Add(param);
                SqlDataReader reader = sqlCmd.ExecuteReader();

                while (reader.Read())
                {
                    Product sqlProduct = new Product();
                    sqlProduct.UserId = (string)reader["UserId"];
                    sqlProduct.Name = (string)reader["Name"];
                    sqlProduct.Category = (string)reader["Category"];
                    SQLProductList.Add(sqlProduct);

                }
                List<Product> myCollection = SQLProductList.ToList();
                ObservableCollection<Product> dbSQLProductsList = new ObservableCollection<Product>(myCollection);
                return dbSQLProductsList;
            }
        }
    }

这是客户端的消费方式(至少根据我遵循的教程:

using (var client = new HttpClient())
        {
            var response = "";
            Task task = Task.Run(async () =>
            {
                response = await client.GetStringAsync(App.BaseUri); // sends GET request
            });
            task.Wait(); // Wait
            listViewAPI.ItemsSource = JsonConvert.DeserializeObject<ObservableCollection<Product>>(response); // Bind the list
        }

App.BaseUri 是:

        public static Uri BaseUri = new Uri("http://localhost:58834/api/Product/"); // base API URL; UserController

所以,我必须说这是我第一次尝试使用 API。 客户端最初依赖于像魅力一样工作的 SQLite。在后期阶段,我决定与 MySQL 同步。我设法让它在客户端应用程序中工作。 但是,我想将所有与 SQL 相关的代码移到 API 中。该 API 不仅适用于 UWP 应用,还适用于 Android 和 iOS(Xamarin.Forms)。

API URL 返回 ASP.NET 主页。显然,API 无法从数据库中获取数据,并且客户端应用程序没有可用的 JSON 数据。

我做错了什么>???

(作为补充——尽管所有与 SQL 相关的代码在客户端都能正常运行)

【问题讨论】:

  • 您是否尝试在 get 处理程序中添加断点?它会被击中吗?我怀疑这与 SQL 有关,而是与应用程序不知道您的控制器有关。
  • 此外,您为什么使用可观察的集合作为 API 端点的结果。这对我来说似乎没有意义,因为您不需要在更改集合时触发任何事件。
  • 在开始做 API 之前,我在 App 中使用了 ObservableCollection。所以我保持原样。
  • @derpirscher 关于您的第一条评论,我必须验证您的建议
  • @derpirscher 我放了断点,但代码没有到达处理程序...

标签: c# mysql json asp.net-web-api sql-server-express


【解决方案1】:

我做了几件事使我的控制器工作: 1. 我没有重命名现有控制器(在项目创建时创建的控制器),而是创建了新控制器。这很重要,因为项目为每个控制器创建了新的 Views 文件夹,没有它它就无法工作,并且它还做了一些其他的魔法使控制器工作。 2. 在 Global.asax.cs 文件中,我重新排序了东西,所以它是这个(正确的)顺序:

 AreaRegistration.RegisterAllAreas();
 GlobalConfiguration.Configure(WebApiConfig.Register);
 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
 RouteConfig.RegisterRoutes(RouteTable.Routes);
 BundleConfig.RegisterBundles(BundleTable.Bundles);

3。在 Web.config 中,我将 runAllManagedModulesForAllRequests="true" 添加到 &lt;modules/&gt; 内的 &lt;system.webServer&gt; 中。

就是这样。 API 正常工作,SQL 数据正在通过 HttpGet 传递到客户端应用程序。

我花了超过 12 个小时来修复它。

【讨论】:

    猜你喜欢
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 2012-04-08
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多