我正在学习如何用C#构建Web API。
我正在测试我的控制器,但是我得到一个空的JSON
响应。
这是我的控制器
public class ClassInfoController : ApiController
{
private ClassRepository classRepo = new ClassRepository();
public IList<string> getClassListByTerm(string termID)
{
List<string> classList = classRepo.getClassListByTerm(termID);
return classList;
}
这是我的存储库类,用于查询我的实体模型
public class ClassRepository : IClass
{
private cet_databaseEntities db = new cet_databaseEntities();
public List<string> getClassListByTerm(string termID)
{
List<string> result = (from t in db.classCodeLookup
where t.termID == termID
orderby t.@class ascending
select t.@class).ToList<string>();
return result;
}
}
我调试了我的控制器,当进行API调用时,此存储库类不向控制器返回任何数据,即空list
。但是,我感到困惑的原因是,当我在存储库类上使用以下测试代码时
public class ClassRepositoryTests
{
ClassRepository testRepo = new ClassRepository();
[TestMethod()]
public void getClassListByTermTest()
{
List<string> output = testRepo.getClassListByTerm("316a");
foreach (string className in output)
{
Console.WriteLine(className);
}
}
}
我从我期望的存储库类中获得结果。
为什么我遇到这个问题?
答案 0 :(得分:0)
尝试向API方法添加属性
[HttpGet]
public List<string> getClassListByTerm([FromUri]string termID)
或者您可以将另一个类对象用于请求数据。 我的意思是
public class TermData
{
//use if nessassry [JsonProperty("TermId")]
public string TermId {get;set;}
}
[HttpGet]
public List<string> getClassListByTerm([FromUri]TermData data)
答案 1 :(得分:0)
我的问题是Visual Studio中的Web API项目提供的自动API文档告诉我,我应该使用以下代码从浏览器调用我的控制器:http://localhost:51520/api/ClassInfo?termID={316a}
。我不知道,这意味着{}
与316a
保持一致 - 我认为它们就像接收参数的方法签名中使用的括号一样,但我认为它们用于传递{{1} /} list
到一个方法(在这种情况下不相关)。这意味着当我的存储库查询运行时,它没有返回任何内容,因为我没有查找字符串json
。
如果我使用以下地址{316a}
调用API,则可以使用,因为字符串http://localhost:51520/api/ClassInfo?termID=316a
会传递给查询。
谢谢大家。
答案 2 :(得分:0)
我有一个继承自DynamicObject的类,它只返回空JSON(而XML似乎正确返回)。
在我的情况下,我能够删除DynamicObject继承并且JSON序列化开始工作。
//didn't serialize to json, but xml worked
public MyClass : DynamicObject, IMyClass { //... }
//works for json and xml
public MyClass : IMyClass { //... }
不幸的是,我没有机会研究为什么DynamicObject
打破JSON序列化。