如何将可选URI参数路由到API控制器函数

时间:2015-12-21 17:40:34

标签: c# rest asp.net-web-api2

我正在尝试使用API​​设置Asp.Net表单站点。 我已经成功添加了选择性身份验证,因此启动“\ api \”的页面不会被重定向,而是挑战基本身份验证。 我现在正在尝试使用MS Web Api 2来进行API路由。

我们的想法是尽可能地保持RESTful。我有一个资源,一个TradableItem,最初我想让API用户以两种方式之一使用HTTP GET。

如果API用户未传递任何项密钥,则用户会收到可能的项密钥列表

<div class="panel-footer"> 
Like <span class="glyphicon glyphicon-thumbs-up"></span>&nbsp;&nbsp;
        <a href='javascript:void(0)' onClick="javascript:toggle<?php echo $idp?>()" style="color:black">Comments</a>
    <div id='toggleComment<?php echo $idp;?>' style="display:none;">
    <form action="" method="POST"><!--FORM COMMENT-->
    <div class="form-group">                        
        <div class="rows" >
        <div class="col-sm-1" style="padding-right:2px;">
        <div class="compic">
                <img src="<?php echo $profilepic; ?>" style="width:100%;height:100%;" />
            </div>
        </div>
        <div class="col-sm-11" style="padding-left:3px; padding-bottom:7px">
              <textarea class="form-control expandable pull-left" name="comment<?php echo $idp;?>" id="comment" placeholder="Write a comment..." required>
                    </textarea>
        </div>
    </div>
    <hr>
    <button type="submit" class="btn btn-primary pull-right" name="subcom<?php echo $idp;?>"><b>Comment</b></button>
    <div class="clearfix"></div>
    </div></form>
    <div class="rows" >
    <?php
    $postid=$idp;
    $postby=$id;
    $postto=$uid;
    if(isset($_POST['subcom'.$postid]))
    {   $postbody=$_POST['comment'.$postid];
        if($postbody!="")
        {$res=mysqli_query($con,"INSERT INTO comment VALUES('','$postby','$postto','$postbody','$postid')");}           
    }
    $show=mysqli_query($con,"SELECT * FROM comment WHERE postid='$idp' ORDER by id");
    while($show_row=mysqli_fetch_array($show))
    {
        $commentbyid=$show_row['cby'];
        $combody=$show_row['cbody'];
                $cbyquery=mysqli_query($con,"SELECT * FROM user WHERE id='$commentbyid'") or die(mysqli_error($con));
                $cby=mysqli_fetch_array($cbyquery);
                $cpic=$cby['profpic'];
                if ($cpic== "" || !file_exists("userdata/profile_pics/$cpic"))
                {
                    $cpic = "images/default_pic.jpg";
                }
                else
                {
                    $cpic = "userdata/profile_pics/".$cpic;
                }
                $cname=ucfirst(strtolower($cby[1]));
                $csname=ucfirst(strtolower($cby[2]));
            ?>
                <div class="col-sm-1" style="padding-right:2px;">
                    <div class="compic">
                        <img src="<?php echo $cpic; ?>" style="width:100%;height:100%;" />
                    </div>
                </div>
                <div class="col-sm-11" style="padding-left:3px;">
                <?php echo $cname." ".$csname;?><br>
                <?php echo $combody;?>
                </div>
            <?php
    }
    ?></div>
    </div><!--Toggle Ends here-->               
</div>

如果API用户将项密钥作为URI的一部分传递,例如“/ api / tradables / abc”,则返回具有key = ABC的TradableItem的表示。 (据我了解,这是标准的REST行为)。

在Global.ASAX的Application_Start()函数中,我有一个像这样的路由图......

  ["ABC","DEF"...]

TradableController.cs文件看起来像这样......

    RouteTable.Routes.MapHttpRoute(
        name: "TradableItemVerbs",
        routeTemplate: "api/tradables/{item}",
        defaults: new { item = System.Web.Http.RouteParameter.Optional, controller = "Tradable" });

问题是只有GetKeys()函数触发,无论我是将GET称为“/ api / tradables”还是“/ api / tradables / abc”。

供参考,使用VS2015社区,IIS 7.5,目标.Net 4.6.1。我使用Rick Strahl的博客作为此指南(以及其他来源)。

http://weblog.west-wind.com/posts/2012/Aug/21/An-Introduction-to-ASPNET-Web-API#HTTPVerbRouting

1 个答案:

答案 0 :(得分:1)

请将您的param的名称更改为item(因为,这是路径中定义的名称):

public string GetTradable(string item)
{
    ....
}

或当您使用参数名称明确调用方法时: / api / tradables?pkey = abc