网站(website)里如何使用webapi2?

by_封爱 2017-03-31 03:46:30
website 而不是webapp..

因为习惯以及历史项目的问题 我不多说了 现在是website.

但是我又觉得webapi2非常不错..

所以新建了一个网站 添加新项目 居然也有webapi2的栏目..

结构是这样的了


但是问题来了.

1`在website里的cs我无法使用c#6.0的代码 .比如



这个需要重新定义一些什么东西吗? webconfig的runtime已经设置了4.6.1(好像没什么关系....)

就算无法使用,也可以 不用呗 但是还是有别的..

2`在webapp中的项目里 有单独的global.asax.cs 里面有这样的代码.


namespace WebApplication1
{
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configuration.Filters.Add(new WebApplication1.Lib.WebApiMonitorFilter());
GlobalConfiguration.Configure(WebApiConfig.Register);
}
}
}


其中第一行是我自己写的一个过滤器那种东西吧..

但是在website里的Global.asax确实这样的.


<%@ Application Language="C#" %>
<script runat="server">
void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码
//GlobalConfiguration.Configuration.Filters.Add(new WebApplication1.Lib.WebApiMonitorFilter());
//GlobalConfiguration.Configure(WebApiConfig.Register);
}


这东西根本没办法打出来啊...这好像根本不是"类"啊???

3`webapp里面有App_Start文件夹并且有默认的WebApiConfig.cs 代码如下.

namespace WebApplication1
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("text/html"));

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




第二句话 是我自己添的..

但是在website里,没有这个"系统文件夹" 就算我强制添加 好像也只是普通文件夹 而且这东西 什么时候执行 我也不清楚..

所以我想问下 论坛有人这么干过吗?

在websiet添加一个 webapi就能访问这种....就好像ashx那样随意.....


...全文
418 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
cdzydgyr 2017-06-16
  • 打赏
  • 举报
回复
楼主,这个研究得如何,我现在遇到同样的问题,一个老网站,想使用webapi。。。。。
by_封爱 2017-04-01
  • 打赏
  • 举报
回复
引用 2 楼 hanjun0612 的回复:
...
好像是顺序的问题 现在已修正 基本的能出来.

public class ValuesController : ApiController
{
    public IEnumerable<string> Get()
    {
        var a = 10;
        var b = a / a;
        return new string[] { "value1", "value2" };
    }
    public string Get(int id)
    {
        return "value";
    }
}
这个我通过URL访问 http://localhost:51361/api/Values/Get http://localhost:51361/api/Values/Get/5 都可以.表示"基本正常" 但是如果我采用以下方式.

[RoutePrefix("BBBBB")]
[Route("{action=Index}")]
public class AAAAAController : ApiController
{
    List<Product> list = new List<Product>() {
                new Product() {id=1, name="产品1",price=11.11,time=DateTime.Parse("2000-01-01")},
                new Product() {id=2, name="产品2",price=22.22,time=DateTime.Parse("2000-02-02")},
                new Product() {id=3, name="产品3",price=33.33,time=DateTime.Parse("2000-03-03")},
                new Product() {id=4, name="产品4",price=44.44,time=DateTime.Parse("2000-04-04")},
        };

    [Route("Product")]
    [Route("Product/{id}")]
    [HttpGet]
    public dynamic xxxxx(int id = 0)
    {
        if (id == 0)
        {
            return list;
        }
        else
        {
            return list.Where(d => d.id == id).FirstOrDefault();
        }
    }

}
public class Product
{
    public int id { get; set; }
    public string name { get; set; }
    public double price { get; set; }
    public DateTime time { get; set; }
}
这我在其他测试是可以的. 但是在网站里 如果我访问. http://localhost:51361/api/BBBBB/Product {"Message":"找不到与请求 URI“http://localhost:51361/api/BBBBB/Product”匹配的 HTTP 资源。","MessageDetail":"未找到与名为“BBBBB”的控制器匹配的类型。"} 如果访问 http://localhost:51361/BBBBB/Product HTTP Error 404.0 - Not Found 实际上 这个地址在另外的项目中. http://localhost:62607/BBBBB/Product 是返回

[{"id":1,"name":"产品1","price":11.11,"time":"2000-01-01T00:00:00"},{"id":2,"name":"产品2","price":22.22,"time":"2000-02-02T00:00:00"},{"id":3,"name":"产品3","price":33.33,"time":"2000-03-03T00:00:00"},{"id":4,"name":"产品4","price":44.44,"time":"2000-04-04T00:00:00"}]
的...
吴太乙 2017-04-01
  • 打赏
  • 举报
回复
封神我是来蹭分的,
by_封爱 2017-04-01
  • 打赏
  • 举报
回复
引用 3 楼 hanjun0612 的回复:
..


奇怪了..我这好像跟你没什么区别..唯一就是没有namespace..

但是一直不成功..


{"Message":"出现错误。","ExceptionMessage":"该对象尚未初始化。请确保在所有其他初始化代码后面的应用程序启动代码中调用 HttpConfiguration.EnsureInitialized()。","ExceptionType":"System.InvalidOperationException","StackTrace":" 在 System.Web.Http.Routing.RouteCollectionRoute.get_SubRoutes()\r\n 在 System.Web.Http.Routing.RouteCollectionRoute.GetRouteData(String virtualPathRoot, HttpRequestMessage request)\r\n 在 System.Web.Http.WebHost.Routing.HttpWebRoute.GetRouteData(HttpContextBase httpContext)"}







如果方便的话.. 能把这个website1的项目发来么?

直接给我.....
正怒月神 版主 2017-03-31
  • 打赏
  • 举报
回复
(我也是醉了。一个用户最多回复3次?!,还好我有权限编辑。不然就不能个回复了。。。并起来看一下最后的效果)
然后看一下 各个文件的配置
Global.asax(HelloWebAPI是我路由的namespace)
void Application_Start(object sender, EventArgs e) 
{
// 在应用程序启动时运行的代码
HelloWebAPI.WebApiConfig.Register(System.Web.Http.GlobalConfiguration.Configuration);
HelloWebAPI.FilterConfig.RegisterGlobalFilters(System.Web.Mvc.GlobalFilters.Filters);
}


WebApiConfig
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}


ValuesController
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}


最后看一下效果
正怒月神 版主 2017-03-31
  • 打赏
  • 举报
回复
然后创建对应的路由文件和apicontroller。
他们必须创建在app_code文件夹里。这是website的规则

正怒月神 版主 2017-03-31
  • 打赏
  • 举报
回复
1 最好是在当前解决方案下,创建一个webapp,然后新建webapi

2 实在要在website下创建,那么应该这么干。
先添加引用和global.asax

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧