ASP.NET Web API 本地主机:xxxx/api/product 默认为主页而不是 JSON 数据(或 XML)
ASP.NET Web API localhost:xxxx/api/product defaults to Home Page and not JSON data(orXML)
我正在尝试通过 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).
APIURLreturnsASP.NET主页。显然,API 无法从数据库中获取数据,并且没有 JSON 数据可用于客户端应用程序。
我做错了什么>???
(作为补充 - 所有 SQL 相关代码在客户端运行良好)
我做了几件事让我的控制器工作:
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"
添加到 <system.webServer>
中的 <modules/>
.
就是这样。 API 有效并且 SQL 数据正在通过 HttpGet 传递到客户端应用程序。
我花了 12 个多小时才修好。
我正在尝试通过 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).
APIURLreturnsASP.NET主页。显然,API 无法从数据库中获取数据,并且没有 JSON 数据可用于客户端应用程序。
我做错了什么>???
(作为补充 - 所有 SQL 相关代码在客户端运行良好)
我做了几件事让我的控制器工作: 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"
添加到 <system.webServer>
中的 <modules/>
.
就是这样。 API 有效并且 SQL 数据正在通过 HttpGet 传递到客户端应用程序。
我花了 12 个多小时才修好。