2016-11-23 51 views
0

我有一个工作的Web API应用程序,它有一个名为StudyDataController的控制器,它接受输入参数,查询数据库并以JSON返回结果。这个工作正常。调用http://localhost:3214/api/StudyDataController?param1=R01&param2=05-NOV-16返回结果。在同一个应用程序上的Web API端点

public class StudyDataController : ApiController 
{ [HttpGet] 
    public HttpResponseMessage Getdetails(string param1, DateTime param2) 
    { 
      List<OracleParameter> p = new List<OracleParameter>(); 
      p.Add(new OracleParameter("param1", OracleDbType.Varchar2,param1, ParameterDirection.Input)); 
      p.Add(new OracleParameter("param2",OracleDbType.Date,param2, ParameterDirection.Input)); 
      string connStr = ConfigurationManager.ConnectionStrings["StudyDataConnection"].ConnectionString; 
      using (OracleConnection dbconn = new OracleConnection(connStr)) 
      { 
       DataSet userDataset = new DataSet(); 
       var strQuery = "SELECT * from Studydata_VW where Request_id = :param1 and RequestDate > :param2 "; 
       var returnObject = new { data = new OracleDataTableJsonResponse(connStr, strQuery, prms.ToArray()) }; 
       var response = Request.CreateResponse(HttpStatusCode.OK, returnObject, MediaTypeHeaderValue.Parse("application/json")); 
       ContentDispositionHeaderValue contentDisposition = null; 
       if (ContentDispositionHeaderValue.TryParse("inline; filename=StudyData.json", out contentDisposition)) 
       { 
        response.Content.Headers.ContentDisposition = contentDisposition; 
       } 
       return response; 
       }}} 

但我现在需要创建一个更多的API有不同的输入参数和查询是不同的,并返回JSON结果。为此,我试图在同一应用程序上创建一个名为StudyDatawithDateController的控制器。

public class StudyDatawithDateController : ApiController 
{ [HttpGet] 
    public HttpResponseMessage Getdetails(DateTime param1,String param2) 
    { 
      List<OracleParameter> p = new List<OracleParameter>(); 
      p.Add(new OracleParameter("param1",OracleDbType.Date,param1, ParameterDirection.Input)); 
      p.Add(new OracleParameter("param2", OracleDbType.Varchar2,param2, ParameterDirection.Input)); 

      string connStr = ConfigurationManager.ConnectionStrings["StudyDataConnection"].ConnectionString; 
      using (OracleConnection dbconn = new OracleConnection(connStr)) 
      { 
       DataSet userDataset = new DataSet(); 
       var strQuery = "SELECT * from Studydata_VW where Submit_date> :param1 and Status = :param2 "; 
       var returnObject = new { data = new OracleDataTableJsonResponse(connStr, strQuery, prms.ToArray()) }; 
       var response = Request.CreateResponse(HttpStatusCode.OK, returnObject, MediaTypeHeaderValue.Parse("application/json")); 
       ContentDispositionHeaderValue contentDisposition = null; 
       if (ContentDispositionHeaderValue.TryParse("inline; filename=StudyDatawithDate.json", out contentDisposition)) 
       { 
        response.Content.Headers.ContentDisposition = contentDisposition; 
       } 
       return response; 
       }}} 

如果我尝试调用端点就像http://localhost:3214/api/StudyDatawithDateController?param1=01-NOV-16&param2=COMPLETE它说Not Found Errorenter image description here

的webConfig.cs就像下面

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 

我们可以对相同的WebAPI应用两个控制器。大部分问题/示例都在讨论关于具有相同名称控制器的问题。但在这里我有不同的名字,我该如何处理这个问题。

+2

您可以拥有任意数量的控制器。你忘了添加http方法属性?你需要发布你的代码。 – Marco

+0

可能是的。 bou're probaby将不得不澄清你的问题。也许一些代码 –

+0

@Marco我编辑了这个问题。你能告诉我我在这里失踪了什么 – trx

回答

1

你可以有很多路由使用get请求去同一个Controller,但是具有不同属性路由的不同action。只需添加属性你想要的方法之上路由的路由处理

[HTTPGET] // http://localhost:3214/api/StudyDatawithDateController?param1=01-NOV-16&param2=COMPLETE [路线( “API/StudyDatawithDateController /参数1 /参数1 {:字符串} /参数2/{参数:字符串” })]

http://localhost:3214/api/StudyDataController?param1=R01&param2=05-NOV-16 〔路线( “API/StudyDataController /参数1/{参数1:串}/param2的/ {参数:字符串”)]

上面的例子将仍然不工作。但如果您更改网址 - 特别是param2和param1 - 给它们一些描述性名称,并且在端点中您将有不同的参数。

第二个示例中的param2是Date和第一个字符串,表示COMPLATE。 - 改变添加属性路线,你会没事的。

+0

我不明白iscomplate – trx

+0

它只是基于[HttpGet] // http:// localhost:3214/api/StudyDatawithDateController中的COMPLETE的示例参数吗?param1 = 01-NOV-16&param2 = COMPLETE现在看我做了一个错误定义示例路线现在将改变它 –

+0

不确定这完全有意义。你说:“你可以有许多路由使用请求去一个和相同的控制器”,但然后给出两个不同的控制器的URL的例子。纠正我,如果我错了,但与例子,因为我不认为你需要路由属性。 – ADyson

相关问题