同一应用程序上的Web API端点

时间:2016-11-23 15:13:14

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

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

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的Controller。

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应用程序上有两个控制器。大多数问题/样本都在讨论有关同名控制器的问题。但在这里我有不同的名字,我该如何处理。

1 个答案:

答案 0 :(得分:1)

您可以将许多路由使用get请求转到同一个Controller但具有不同属性路由的不同操作。只需在您希望路由处理的方法上添加属性路由

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

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

上面的示例仍然不起作用。但是如果你改变了网址 - 特别是param2和param1 - 给它们一些描述性名称,在端点你将有不同的参数。

第二个例子中的

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