使用字符串参数调用web api

时间:2015-11-19 08:38:31

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

我有一个web api,我有2个方法,一个没有参数,两个有不同类型的参数(字符串和整数)。当调用字符串方法时它不起作用......我在这里缺少什么?

public class MyControllerController : ApiController
{
    public IHttpActionResult GetInt(int id)
    {
        return Ok(1);
    }

    public IHttpActionResult GetString(string test)
    {
        return Ok("it worked");
    }
}

WebApiConfig.cs:

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 }
    );
}

我的电话:

  

/ api / MyController / MyString //无效

     

/ api / MyController / 1 //工作

我收到以下错误:

  

参数字典包含非可空类型'System.Int32'的参数'id'的空条目,用于'TestAngular.Controllers.MyControllerController'中的方法'System.Web.Http.IHttpActionResult GetInt(Int32)'。可选参数必须是引用类型,可空类型,或者声明为可选参数。

我的请求中缺少什么?

5 个答案:

答案 0 :(得分:7)

你必须改变你的uri's

/api/MyController

/api/MyController/string 

/api/MyController/1 

您不必指定方法。

您可以在asp.net上查看此tutorial以进一步说明。

答案 1 :(得分:6)

此uri也应该有效:

api/MyController/GetAll
api/MyController/GetString?param=string
api/MyController/GetInt?param=1

我认为这更加清晰,应该始终有效。 您使用路由行为。

见这里: http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection

答案 2 :(得分:5)

这是我的解决方案: 不改变webapiconfig.cs文件中的默认路由

只添加一个到字符串函数的路径:

[Route("Api/MyController/GetString/{test}")]
public IHttpActionResult GetString(string test)

http://localhost:49609/api/MyController/GetString/stringtest

答案 3 :(得分:3)

你发布这个已经有一段时间,但我想我有答案。 首先,有两个问题。首先,正如Pinback指出的那样,你不能对两个不同的端点使用相同的路由。

但是,如果您只是消除了int方法,那么您仍然会遇到问题。 请记住:默认路由如下所示:api / {controller} / {id} 为了绑定参数,它必须被称为“id”,而不是“test”。

将签名更改为:

public IHttpActionResult GetString(string id)

它会起作用。 (您也可以在webapiconfig.cs文件中将{id}更改为{test}

答案 4 :(得分:0)

您还可以在主体中使用字符串参数

string body;
using (var sr = new StreamReader(Request.Body))
body = sr.ReadToEnd();