标签: asp.net-web-api2

将Global.asax迁移到Startup.cs

为了更好地测试工作Microsoft.Owin.Testing.TestServer,我发现Global.asax没有加载Owin TestServer.

所以,我尝试将我的Global.asax配置移动到Startup.cs,如下所示,

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        // pasted Global.asax things start.
        GlobalConfiguration.Configuration.Formatters.Clear();

        var jsonSerializerSettings = new JsonSerializerSettings
        {
            PreserveReferencesHandling = PreserveReferencesHandling.Objects,
            ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
        };
        GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter() { SerializerSettings = jsonSerializerSettings });
        GlobalConfiguration.Configuration.Formatters.Add(new FormMultipartEncodedMediaTypeFormatter());

        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        // pasted Global.asax things end.

        ConfigureAuth(app);
    }
}
Run Code Online (Sandbox Code Playgroud)

TestServer 到配置的每一点初始化,如AreaRegistration.RegisterAllAreas,FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters),等...

对我来说,最小可行迁移(使用TestServer成功测试)如下所示.

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var config = new HttpConfiguration(); …
Run Code Online (Sandbox Code Playgroud)

c# asp.net unit-testing asp.net-mvc-4 asp.net-web-api2

29
推荐指数
1
解决办法
3万
查看次数

将JToken内容反序列化为对象

我想将JToken内容反序列化为一个对象(User).我怎么能这样做?

这是我的json字符串:

string json = @"[{""UserId"":0,""Username"":""jj.stranger"",""FirstName"":""JJ"",""LastName"":""stranger""}]";
Run Code Online (Sandbox Code Playgroud)

这被发送到api参数as JToken.

用户类:

public class user
{
    public int UserId {get; set;}
    public string Username {get; set;}
    public string FirstName {get; set;}
    public string LastName {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

Web Api方法:

public IHttpActionResult Post([FromBody]JToken users)
{
       UserModel.SaveUser(users);
       //...
}
Run Code Online (Sandbox Code Playgroud)

Salesforce中的API调用:

string json = '[{"UserId":0,"Username":"jj.stranger","FirstName":"JJ","LastName":"stranger"}];
HttpRequest req = new HttpRequest();
HttpResponse res = new HttpResponse();
Http http = new Http();

req.setEndpoint('test.com/api/UserManagement');
req.setMethod('POST');
req.setBody(json);
req.setHeader('Content-Type', 'application/json');

try {
    res = http.send(req);
} catch(System.CalloutException e) …
Run Code Online (Sandbox Code Playgroud)

c# json salesforce json.net asp.net-web-api2

29
推荐指数
1
解决办法
3万
查看次数

Autofac RegisterInstance与SingleInstance

IProductRepositoryProxy ProductDataServiceProviderInstance = new ServiceProductDataProvider();
builder.RegisterInstance(ProductDataServiceProviderInstance).As<IProductRepositoryProxy>();
Run Code Online (Sandbox Code Playgroud)

VS

builder.RegisterType<ServiceProductDataProvider>().As<IProductRepositoryProxy>().InstancePerRequest();
Run Code Online (Sandbox Code Playgroud)

我在这里看到了来自前雇员的代码,并想知道这个人是否想要注册.SingleInstance()行为.

builder.RegisterType<ServiceProductDataProvider>().As<IProductRepositoryProxy>().SingleInstance();
Run Code Online (Sandbox Code Playgroud)

使用RegisterInstance的ServiceProductDataProvider的手动新增与Register .SingleInstance()不同吗?

c# autofac asp.net-web-api asp.net-web-api2

29
推荐指数
1
解决办法
3万
查看次数

WebApi 2 POST使用单个字符串参数而不是wokring

我有以下控制器:

public class ValuesController : ApiController
{
    // POST api/values
    public IHttpActionResult Post(string filterName)
    {
        return new JsonResult<string>(filterName, new JsonSerializerSettings(), Encoding.UTF8, this);

    }
}
Run Code Online (Sandbox Code Playgroud)

WebApi配置

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

我使用这个js代码来调用api

$.ajax(
{
    url: "/api/values/",
    type: "POST",
    dataType: 'json',
    data: { filterName: "Dirty Deeds" },
    success: function (result) {
        console.log(result);
    },
    error: function (xhr, status, p3, p4) {
        var err = "Error " + " " + status + " " + p3; …
Run Code Online (Sandbox Code Playgroud)

javascript c# asp.net-web-api asp.net-web-api2

29
推荐指数
2
解决办法
4万
查看次数

ASP.NET Web Api 2/EF6首先调用初始化性能

第一次调用我们的API总是非常慢.例如,下面演示了第一次调用完成所需的CPU使用率和时间:

CPU使用率

第一次通话最多可能需要30秒,并且几乎可以占用100%的CPU.呼叫2和3需要200ms(他们应该这样做).在回收应用程序池之后,它将在第一次调用时执行相同的操作.

我已经阅读了一些有关IIS"热身"的内容,并完成了以下操作,但没有任何改变:

IIS 8应用程序初始化已安装:

IIS 8应用程序初始化

我在IIS中有以下设置:

  • Start Mode设置为AlwaysRunning:

AlwaysRunning

  • 回收超时设置为0:

回收超时

  • 空闲超时设置为0:

空闲超时

  • 在网站上将Preload Enabled设置为true:

预加载已启用

我实际上是在代码中设置这些RoleEntryPoint.OnStart().

using (var serverManager = new ServerManager())
{
    serverManager.ApplicationPoolDefaults.ProcessModel.IdleTimeout = TimeSpan.Zero;

    foreach (var application in serverManager.Sites.SelectMany(x => x.Applications))
    {
        application["preloadEnabled"] = true;

    }

    foreach (var applicationPool in serverManager.ApplicationPools)
    {
        applicationPool.AutoStart = true;
        applicationPool["startMode"] = "AlwaysRunning";
        applicationPool.ProcessModel.IdleTimeout = TimeSpan.Zero;
        applicationPool.Recycling.PeriodicRestart.Time = TimeSpan.Zero;

    }

    serverManager.CommitChanges();
}
Run Code Online (Sandbox Code Playgroud)

我几乎可以肯定实体框架可能是罪魁祸首:

  • 我们在EDMX模型"设计师"中生成大约100个表格的模型.

  • 我们正在生成由EF Power Tools 生成的预编译视图.

  • 运行以下 …

iis entity-framework iis-8 entity-framework-6 asp.net-web-api2

28
推荐指数
1
解决办法
4644
查看次数

如何在WebAPI中使用Swagger作为IAppBuilder的欢迎页面

我尝试将Swagger与Microsoft WebAPI 2 一起使用.

目前,我在一个方法中进行了以下调用.

appBuilder
   .ConfigureOAuth()
   .UseWebApi(configuration)
   .UseWelcomePage();
Run Code Online (Sandbox Code Playgroud)

如果我想使用Swagger,我必须使用这个URL" https:// localhost:44300/swagger "哪一个非常好用.

我希望我的主页重定向到我的招摇的网址,也许如下,但这个示例不起作用.

    appBuilder
       ...
       .UseWelcomePage("/swagger");
Run Code Online (Sandbox Code Playgroud)

任何的想法 ?

swagger katana asp.net-web-api2

28
推荐指数
6
解决办法
2万
查看次数

AspNet Identity 2:自定义OAuth端点响应

我成功实现了我的自定义OAuthAuthorizationServerProvider.但是当我登录并检索令牌时,我的客户端不知道用户的角色,声明等.

我目前添加了一个webapi控制器来返回委托人的声明列表,但我对此并不满意.

请求令牌时,当前响应如下所示:

{
    access_token: "qefelgrebjhzefilrgo4583535",
    token_type: "bearer",
    expires_in: 59
}
Run Code Online (Sandbox Code Playgroud)

问:如何让它返回类似下面的片段?

{
    access_token: "qefelgrebjhzefilrgo4583535",
    token_type: "bearer",
    expires_in: 59,
    user: {
        name: 'foo',
        role: 'bar'
    }
}
Run Code Online (Sandbox Code Playgroud)

我到目前为止的进展:

文件OAuthAuthorizationServerProvider#TokenEndpoint(OAuthTokenEndpointContext)说:

在成功的令牌端点请求的最后阶段调用.应用程序可以实现此调用,以便对用于发出访问或刷新令牌的权利要求进行任何最终修改.也可以使用此调用以向Token端点的json响应主体添加其他响应参数.

我找不到任何如何自定义响应的示例,并且asp-net Identity的源代码尚未发布,所以我很困惑.

oauth-2.0 asp.net-identity asp.net-web-api2

27
推荐指数
1
解决办法
8674
查看次数

为Web Api 2和OWIN令牌身份验证启用CORS

我有一个ASP.NET MVC 5 webproject(localhost:81),它使用Knockoutjs从我的WebApi 2项目(localhost:82)调用函数,以便在我启用CORS的两个项目之间进行通信.到目前为止,一切都有效,直到我尝试对WebApi实施OWIN令牌认证.

要在WebApi上使用/ token端点,我还需要在端点上启用CORS,但经过几个小时的尝试和搜索解决方案后,它仍在运行,并且api/token仍然会导致:

XMLHttpRequest cannot load http://localhost:82/token. No 'Access-Control-Allow-Origin' header is present on the requested resource. 

public void Configuration(IAppBuilder app)
{
    app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
    TokenConfig.ConfigureOAuth(app);
    ...
}
Run Code Online (Sandbox Code Playgroud)

TokenConfig

public static void ConfigureOAuth(IAppBuilder app)
{
    app.CreatePerOwinContext(ApplicationDbContext.Create);
    app.CreatePerOwinContext<AppUserManager>(AppUserManager.Create);

    OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
    {
        AllowInsecureHttp = true,
        TokenEndpointPath = new PathString("/token"),
        AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
        Provider = new SimpleAuthorizationServerProvider()
    };

    app.UseOAuthAuthorizationServer(OAuthServerOptions);
    app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
Run Code Online (Sandbox Code Playgroud)

AuthorizationProvider

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
    context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });

    var appUserManager = context.OwinContext.GetUserManager<AppUserManager>(); …
Run Code Online (Sandbox Code Playgroud)

cors asp.net-web-api owin asp.net-mvc-5 asp.net-web-api2

27
推荐指数
2
解决办法
2万
查看次数

将[Authorize]属性隐式应用于所有Web API控制器

我的应用程序设置为必须使用Web API中的授权属性"授权"除登录之外的所有请求.例如

 [Authorize]
 [HttpGet, Route("api/account/profile")]
 public ApplicationUser Profile()
 {
       return userModel;
 }
Run Code Online (Sandbox Code Playgroud)

并且只有登录需要不授权,因为那里你得到令牌;)

[AllowAnonymous]
[HttpPost, Route("api/account/login")]
public async Task<IHttpActionResult> Login(LoginViewModel model)
{
   ....
}
Run Code Online (Sandbox Code Playgroud)

而不是必须将[Authorize]属性添加到我的所有路由,有没有办法全局设置它?

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

26
推荐指数
4
解决办法
2万
查看次数