PostAsJsonAsync 找不到请求的 URI
PostAsJsonAsync cannot find requested URI
我目前正在学习如何使用 OWIN 和 Katana 创建 C# 服务器。
我正在尝试回复一个 POST,但不幸的是它没有找到该函数。
这就是我所拥有的:
这是一个用户端class,这是通过 POST (PostAsJsonAsync()).
发送用户数据(用户名和密码)
public class UserRegisterClient
{
string _accessToken;
Uri _baseRequestUri; // http://localhost:8080
public UserRegisterClient(Uri baseUri, string accessToken)
{
_accessToken = accessToken;
_baseRequestUri = new Uri(baseUri, "api/register/");
}
// Handy helper method to set the access token for each request:
void SetClientAuthentication(HttpClient client)
{
client.DefaultRequestHeaders.Authorization
= new AuthenticationHeaderValue("Bearer", _accessToken);
}
public async Task<HttpStatusCode> AddUserAsync(string username, string password)
{
HttpResponseMessage response;
using (var client = new HttpClient())
{
SetClientAuthentication(client);
response = await client.PostAsJsonAsync(
_baseRequestUri.ToString(), new KeyValuePair<string, string>(username, password));
}
return response.StatusCode;
}
}
附加信息:
在AddUserAsync函数client.PostAsJsonAsync()returns中以下:
response =
{
StatusCode: 404,
ReasonPhrase: 'Not Found',
Version: 1.1,
Content: System.Net.Http.StreamContent,
Headers:
{
Date: Sat, 11 Jul 2015
18:16:53 GMT Server: Microsoft-HTTPAPI/2.0 Content-Length: 190
Content-Type: application/json; charset=utf-8
}
} System.Net.Http.HttpResponseMessage
在服务器端,我有一个控制器,看起来像这样:
[RoutePrefix("api/register/")]
class RegisterController : ApiController
{
public async Task<IHttpActionResult> Post(KeyValuePair<string, string> userData)
{
// I never get inside here
}
}
在服务器端,在Startupclass,可以看到路由设置:
private HttpConfiguration ConfigureWebApi()
{
var config = new HttpConfiguration();
config.Routes.MapHttpRoute(
"DefaultApi",
"api/{controller}/{id}",
new { id = RouteParameter.Optional });
return config;
}
编辑:在我的控制器之前将 Route 更改为 RoutePrefix class。
制作控制器 class public.
[Route("api/register/")]
public class RegisterController : ApiController
不是 public 意味着 Web API 系统无法发现控制器及其操作。
我首先要查看的是您安装了哪些 NuGet 包,并确保您的启动程序中的一切正常 class。您的 Startup class 应该如下所示:
public class Startup
{
public void Configuration(IAppBuilder app)
{
var config = ConfigureWebApi();
app.UseWebApi(config);
}
}
如果您在 IIS 上托管,请确保安装了这些 NuGet 包:
- Newtonsoft.Json
- Microsoft.AspNet.WebApi.Client
- Microsoft.AspNet.WebApi.Core
- Microsoft.AspNet.WebApi.Owin
- Microsoft.Owin.Host.System.Web
- Microsoft.Owin
- 欧文
尝试将 public
添加到您的控制器:
[Route("api/register/")]
public class RegisterController : ApiController
{
public async Task<IHttpActionResult> Post(KeyValuePair<string, string> userData)
{
// I never get inside here
}
}
由于您使用的是 owin/katana 和属性路由,因此您可以摆脱旧式 Web api 配置:
var config = new HttpConfiguration();
config.Routes.MapHttpRoute(
"DefaultApi",
"api/{controller}/{id}",
new { id = RouteParameter.Optional });
return config;
并改用它:
config.MapHttpAttributeRoutes();
之前
app.UseWebApi(config);
这样做你将不得不在你的网络中为每一个 ruote 添加前缀 api 但是,我想,它更容易理解,我听说它将成为 vNext 的标准。
我目前正在学习如何使用 OWIN 和 Katana 创建 C# 服务器。
我正在尝试回复一个 POST,但不幸的是它没有找到该函数。
这就是我所拥有的:
这是一个用户端class,这是通过 POST (PostAsJsonAsync()).
public class UserRegisterClient
{
string _accessToken;
Uri _baseRequestUri; // http://localhost:8080
public UserRegisterClient(Uri baseUri, string accessToken)
{
_accessToken = accessToken;
_baseRequestUri = new Uri(baseUri, "api/register/");
}
// Handy helper method to set the access token for each request:
void SetClientAuthentication(HttpClient client)
{
client.DefaultRequestHeaders.Authorization
= new AuthenticationHeaderValue("Bearer", _accessToken);
}
public async Task<HttpStatusCode> AddUserAsync(string username, string password)
{
HttpResponseMessage response;
using (var client = new HttpClient())
{
SetClientAuthentication(client);
response = await client.PostAsJsonAsync(
_baseRequestUri.ToString(), new KeyValuePair<string, string>(username, password));
}
return response.StatusCode;
}
}
附加信息:
在AddUserAsync函数client.PostAsJsonAsync()returns中以下:
response =
{
StatusCode: 404,
ReasonPhrase: 'Not Found',
Version: 1.1,
Content: System.Net.Http.StreamContent,
Headers:
{
Date: Sat, 11 Jul 2015
18:16:53 GMT Server: Microsoft-HTTPAPI/2.0 Content-Length: 190
Content-Type: application/json; charset=utf-8
}
} System.Net.Http.HttpResponseMessage
在服务器端,我有一个控制器,看起来像这样:
[RoutePrefix("api/register/")]
class RegisterController : ApiController
{
public async Task<IHttpActionResult> Post(KeyValuePair<string, string> userData)
{
// I never get inside here
}
}
在服务器端,在Startupclass,可以看到路由设置:
private HttpConfiguration ConfigureWebApi()
{
var config = new HttpConfiguration();
config.Routes.MapHttpRoute(
"DefaultApi",
"api/{controller}/{id}",
new { id = RouteParameter.Optional });
return config;
}
编辑:在我的控制器之前将 Route 更改为 RoutePrefix class。
制作控制器 class public.
[Route("api/register/")]
public class RegisterController : ApiController
不是 public 意味着 Web API 系统无法发现控制器及其操作。
我首先要查看的是您安装了哪些 NuGet 包,并确保您的启动程序中的一切正常 class。您的 Startup class 应该如下所示:
public class Startup
{
public void Configuration(IAppBuilder app)
{
var config = ConfigureWebApi();
app.UseWebApi(config);
}
}
如果您在 IIS 上托管,请确保安装了这些 NuGet 包:
- Newtonsoft.Json
- Microsoft.AspNet.WebApi.Client
- Microsoft.AspNet.WebApi.Core
- Microsoft.AspNet.WebApi.Owin
- Microsoft.Owin.Host.System.Web
- Microsoft.Owin
- 欧文
尝试将 public
添加到您的控制器:
[Route("api/register/")]
public class RegisterController : ApiController
{
public async Task<IHttpActionResult> Post(KeyValuePair<string, string> userData)
{
// I never get inside here
}
}
由于您使用的是 owin/katana 和属性路由,因此您可以摆脱旧式 Web api 配置:
var config = new HttpConfiguration();
config.Routes.MapHttpRoute(
"DefaultApi",
"api/{controller}/{id}",
new { id = RouteParameter.Optional });
return config;
并改用它:
config.MapHttpAttributeRoutes();
之前
app.UseWebApi(config);
这样做你将不得不在你的网络中为每一个 ruote 添加前缀 api 但是,我想,它更容易理解,我听说它将成为 vNext 的标准。