c# - Url.Link 在 Web Api 2 中抛出 Not Implemented 异常

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

我有以下 Controller 方法:

 [Authorize]
    public IHttpActionResult Post(AlertDataModel model)
    {
        var userID = this.User.Identity.GetUserId();
        var alert = new Alert
        {
            Content = model.Content,
            ExpirationDate = DateTime.Now.AddDays(5),
            UserId = userID
        };

        this.Data.Alerts.Add(alert);
        this.Data.SaveChanges();

        var returnedAlert = new AlertDataModel
        {
            ID = alert.ID,
            Content = alert.Content
        };
        var link = Url.Link(routeName: "DefaultApi", routeValues: new { id = alert.ID });
        var uri = new Uri(link);
        return Created(uri, returnedAlert);
    }

但是我在这一行得到了 NotImplementedException :

var link = Url.Link(routeName: "DefaultApi", routeValues: new { id = alert.ID });

这是完整的错误:

Message: "An error has occurred."
ExceptionMessage: "The method or operation is not implemented."
ExceptionType: "System.NotImplementedException"
StackTrace: " at System.Web.HttpContextBase.get_Response()\ \ at System.Web.UI.Util.GetUrlWithApplicationPath(HttpContextBase context, String url)\ \ at System.Web.Routing.RouteCollection.NormalizeVirtualPath(RequestContext requestContext, String virtualPath)\ \ at System.Web.Routing.RouteCollection.GetVirtualPath(RequestContext requestContext, String name, RouteValueDictionary values)\ \ at System.Web.Http.WebHost.Routing.HostedHttpRouteCollection.GetVirtualPath(HttpRequestMessage request, String name, IDictionary`2 values)\ \ at System.Web.Http.Routing.UrlHelper.GetVirtualPath(HttpRequestMessage request, String routeName, IDictionary`2 routeValues)\ \ at System.Web.Http.Routing.UrlHelper.Route(String routeName, IDictionary`2 routeValues)\ \ at System.Web.Http.Routing.UrlHelper.Link(String routeName, IDictionary`2 routeValues)\ \ at System.Web.Http.Routing.UrlHelper.Link(String routeName, Object routeValues)\ \ at Exam.WebAPI.Controllers.AlertsController.Post(AlertDataModel model) in c:\\Users\\Kiril\\Desktop\\New folder\\Exam.WebAPI\\Controllers\\AlertsController.cs:line 63\ \ at lambda_method(Closure , Object , Object[] )\ \ at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)\ \ at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)\ \ at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)\ \ --- End of stack trace from previous location where exception was thrown ---\ \ at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\ \ at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\ \ at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()\ \ --- End of stack trace from previous location where exception was thrown ---\ \ at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\ \ at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\ \ at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\ \ --- End of stack trace from previous location where exception was thrown ---\ \ at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\ \ at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\ \ at System.Web.Http.Filters.AuthorizationFilterAttribute.<ExecuteAuthorizationFilterAsyncCore>d__2.MoveNext()\ \ --- End of stack trace from previous location where exception was thrown ---\ \ at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\ \ at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\ \ at System.Web.Http.Controllers.AuthenticationFilterResult.<ExecuteAsync>d__0.MoveNext()\ \ --- End of stack trace from previous location where exception was thrown ---\ \ at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\ \ at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\ \ at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"

我有以下路由:

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

我尝试反编译代码,在 ReflectedHttpActionDescriptor.ExecuteAsync 方法中抛出错误。

有什么想法吗?

最佳答案

如果您使用的是 OWIN,请确保您在启动配置方法中使用新的 HttpConfiguration 对象:

public class Startup
{
    public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }
    public static string PublicClientId { get; private set; }

    public void Configuration(IAppBuilder app)
    {
        var config = new HttpConfiguration();

        ConfigureWebApi(config);

        ConfigureAuth(app);

        app.UseWebApi(config);
    }

    ...

}

我花了几个小时才弄清楚在使用 OWIN 时不应该使用对 GlobalConfiguration 的引用:

GlobalConfiguration.Configure(WebApiConfig.Register);

关于c# - Url.Link 在 Web Api 2 中抛出 Not Implemented 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25979306/

相关文章:

c# - 如何让 EasyHook 工作?

asp.net-web-api - owin cors或web api cors

asp.net-mvc-4 - 使用 IIS 7 在服务器上部署时,WebAPI 显示 404 错误,但作为 selfhost 工作正常

html - 仅仅为了拥有多个 Controller 而创建 Div 是一种不好的做法吗?

c# - 无法将元组添加到 BlockingCollection : Error CS1503 in C#

c# - 将项目加入单个列表<>

带有 SignalR 的 Azure Service Fabric WebAPI

c# - PostAsync to/Token 返回内部服务器错误

iis - 异步操作方法对 IIS 有什么影响?

c# - 选择 XML 中的节点