标签: servicestack

如何让Swagger将API密钥作为http而不是URL发送

我正在使用swagger与servicestack,但我从我的/资源URL获得401未经授权的错误,因为它需要一个API密钥.

除非我记错了,根据文档我应该设置supportHeaderParams为真还有apiKeyNameapiKey从我的html页面初始化时扬鞭值在JSON参数.

我当时希望在http请求标头中看到我的API密钥,但它仍然被附加到URL而不是标头集合中.

以下是在我的HTML页面中初始化Swagger的代码:

 window.swaggerUi = new SwaggerUi({
            discoveryUrl: "http://pathtomyservice.com/resources",
                headers: { "testheader" : "123" },
                apiKey: "123",
                apiKeyName: "Api-Key",
                dom_id:"swagger-ui-container",
                supportHeaderParams: true,
                supportedSubmitMethods: ['get', 'post', 'put', 'delete'],
                onComplete: function(swaggerApi, swaggerUi){
                    if(console) {
                        console.log("Loaded SwaggerUI");
                        console.log(swaggerApi);
                        console.log(swaggerUi);
                    }
                  $('pre code').each(function(i, e) {hljs.highlightBlock(e)});
                },
                onFailure: function(data) {
                    if(console) {
                        console.log("Unable to Load SwaggerUI");
                        console.log(data);
                    }
                },
                docExpansion: "none"
            });
Run Code Online (Sandbox Code Playgroud)

不幸的是我根本没有标题,没有'Api-Key'或'testheader'.

javascript servicestack swagger

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

获取ServiceStack以保留类型信息

我正在使用ServiceStack将一些对象序列化和反序列化为JSON.考虑这个例子:

public class Container
{
    public Animal Animal { get; set; }
}

public class Animal
{
}

public class Dog : Animal
{
    public void Speak() { Console.WriteLine("Woof!"); }
}

var container = new Container { Animal = new Dog() };
var json = JsonSerializer.SerializeToString(container);
var container2 = JsonSerializer.DeserializeFromString<Container>(json);

((Dog)container.Animal).Speak(); //Works
((Dog)container2.Animal).Speak(); //InvalidCastException
Run Code Online (Sandbox Code Playgroud)

最后一行抛出InvalidCastException,因为Animal字段被实例化为Animal类型,而不是Dog类型.有什么办法可以告诉ServiceStack保留这个特定实例属于Dog类型的信息吗?

.net c# serialization json servicestack

20
推荐指数
1
解决办法
9339
查看次数

ASP.NET MVC中的ServiceStack.NET Windows身份验证(NTLM)

如何在ASP.NET MVC4上构建的ServiceStack项目中实现Windows身份验证?

我开始使用添加的全局请求过滤器AppHost:

private void ConfigureAuth(Funq.Container container)
{
    this.RequestFilters.Add((httpReq, httpResp, requestDto) =>
    {
        var user = HttpContext.Current.User.Identity;
        if (!user.IsAuthenticated ||
            !user.Name.Contains(_myTestUser)) //todo: check username here in database (custom logic) if it has access to the application
            httpResp.ReturnAuthRequired();
    });
}
Run Code Online (Sandbox Code Playgroud)

这将打开一个登录对话框,如果输入正确(用户名存在且输入了有效密码,并且myTestUser设置为此密码),则会产生成功的响应.如果有任何错误,将再次显示登录对话框. - 这对我来说听起来不错.但在第二个登录窗口中重新输入正确的用户后,它将停止工作.该对话框再次打开,如果它再次不正确.过滤器函数内没有遇到断点.

知道是什么原因引起的吗?

这就是我在web.config中添加的内容:

<authentication mode="Windows"/>
<authorization>
  <deny users="?" /> <!--only allow authenticated users-->
</authorization>
Run Code Online (Sandbox Code Playgroud)

我想完全锁定网站并仅使用其特定权限(角色)启用对数据库中指定Windows用户的访问.我需要实现自定义逻辑来访问"用户和角色列表".也许在MVC4/ASP.NET中有另一种方法可以做到这一点?

c# windows-authentication servicestack asp.net-mvc-4

20
推荐指数
1
解决办法
8257
查看次数

Servicestack - 架构和重用POCO的一切

我参考ServiceStack文档注册使用POCO:

由于它促进了干净,可重复使用的代码,ServiceStack始终鼓励使用代码优先的POCO来处理所有事情.

即可以使用相同的POCO:
在请求和响应中DTO(在客户端和服务器上)
在JSON,JSV和CSV文本序列化器中
作为OrmLite,db4o和NHibernate中的数据模型
作为存储在Redis中的实体
作为存储在缓存和会话中的blob
在MQ的服务中删除并执行"

我喜欢servicestack以及使用它编写Web服务是多么容易.我试图了解如何最好地设置我的项目,而不是遇到任何问题.

具体来说,我正在与返回响应对象的架构理念作斗争,该对象也是一个数据模型(如SS所建议的).关注分离的想法在我内心过于根深蒂固.如果你对所有事情都使用相同的POCO,那么将不会遇到问题.例如,返回例如视图对象不是"更安全"吗?

architecture separation-of-concerns servicestack

20
推荐指数
1
解决办法
8168
查看次数

使用JSON时如何让ServiceStack使用破折号格式化Guids?

使用ServiceStack从Post返回一个简单的User对象.

用户对象非常简单:

public class User
{
    public Guid Id { get; set; }
    public string Username { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

帖子方法:

public override object OnPost(User user)
{
    User newUser;
    // Do stuff to user...
    return newUser;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是ServiceStack没有破折号格式化Guid,所以JSON响应看起来像这样:

{"id":"c884ce020ec94c65a8788c2ddc500434","username":"new user name"}
Run Code Online (Sandbox Code Playgroud)

客户端是Android/Java客户端,UUID.fromString()方法对此格式感到不满.

有没有办法强制ServiceStack返回用破折号格式化的Guid?

c# json guid servicestack

19
推荐指数
1
解决办法
2123
查看次数

在Service Stack REST API服务中使用SignalR

是否可以在服务堆栈项目中使用SignalR?我们目前正在为REST Web API使用服务堆栈.我们总体上对它的架构,灵活性等感到高兴.现在我们正在探索使用事件驱动或推送技术(与状态轮询相比)与我们的呼叫客户端进行通信的方法.我应该注意到,我们目前使用AppHostHttpListenerBase(在IIS内部托管)在Windows服务中托管我们的API.

是否有可能配置一个专门的路由,以某种方式传递给SignalR Hub,所以这两个可以并存?例如,它http://localhost:8000/api/live/jobs/jobid会击中SignalR代码,但http://localhost:8000/api/jobs/jobid会路由到当前基于DTO的服务堆栈代码.

PS - 我们希望继续以自主模式托管,因为我们喜欢移植到Mono并在Linux上运行的灵活性(与IIS绑定).

webserver servicestack web signalr

19
推荐指数
1
解决办法
3345
查看次数

使用ServiceStack控制"每个用户每个对象"权限的最佳设计模式?

我知道ServiceStack提供了一个RequiredRole属性来控制权限,但是,这并不完全适用于我的用例.我的网站有很多用户生成的内容.用户只能编辑他们具有显式权限的文档.每个对象或对象组控制权限.因此,如果用户是组的管理员,则他们可以编辑该组管理的所有文档.

在此per object per user基础上控制对请求的访问的最佳设计模式是什么?我希望尽可能使用DRY方法,因为它会影响我所有API端点的95%.

此外,它是否可以与FluentValidation集成并返回适当的HTTP响应?

非常感谢,

理查德.

permissions design-patterns servicestack

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

禁用ASP.NET HttpHandler响应缓存

背景

我正在比较在IIS 7下运行的NancyFx和ServiceStack.NET的性能(在Windows 7主机上进行测试).两者都非常快 - 在本地测试每个框架进程超过10,000 req/sec,ServiceStack的速度提高了约20%.

我遇到的问题是ASP.NET似乎正在缓存来自HttpHandler的每个唯一URI请求的响应,很快导致大量内存压力(3 GB以上)和垃圾收集器过度工作(大约25%的时间消耗GC).到目前为止,我一直无法禁用对象的缓存和构建,并且正在寻找有关如何禁用此行为的建议.

细节

请求循环基本如下:

for i = 1..100000:
    string uri = http://localhost/users/{i}
    Http.Get(uri)
Run Code Online (Sandbox Code Playgroud)

响应是一个简单的JSON对象,格式为{UserID:n}.

我已经破解了打开的WinDBG,并且每个请求都有:

  • System.Web.FileChangeEventHandler
  • System.Web.Configuration.MapPathCacheInfos
  • System.Web.CachedPathDatas
  • System.Web.Caching.CacheDependencys
  • System.Web.Caching.CacheEntrys

显然,这些缓存项目让我相信它是一个缓存膨胀问题(我很想摆脱150,000个无法使用的对象!).

到目前为止我尝试过的

  • 在IIS的"HTTP Resonse Headers"中,将"Expire Web content"设置为"Immediate".
  • 在web.config中

    <system.web>
     <caching>
        <outputCache enableOutputCache="false" enableFragmentCache="false"/>
      </caching>
    </system.web>
    
    Run Code Online (Sandbox Code Playgroud)
  • 同样在web.config中(以及策略的许多变体,包括无).

    <caching enabled="false" enableKernelCache="false">
      <profiles>
        <add policy="DontCache" kernelCachePolicy="DontCache" extension="*/>
      </profiles>
    </caching>
    
    Run Code Online (Sandbox Code Playgroud)
  • 查看框架的源代码,看看是否可能存在使用ASP.NET缓存的任何"功能".虽然有缓存帮助程序,但它们对框架本身是私有的,并且似乎不利用ASP.NET缓存.

更新#1

通过反射器挖掘我发现将值设置UrlMetadataSlidingExpiration为零消除了过多内存使用的大部分,代价是将吞吐量减少50%(FileAuthorizationModule类缓存FileSecurityDescriptors,生成时必须有些昂贵,UrlMetadataSlidingExpiration是非零).

这是通过更新web.config并将以下内容放入:

<hostingEnvironment urlMetadataSlidingExpiration="00:00:00"/>
Run Code Online (Sandbox Code Playgroud)

如果可能的话,我将尝试完全禁用FileAuthorizationModule运行,看看是否有帮助.但是,ASP.NET仍然会生成2*N MapPathCacheInfoCacheEntry对象,因此内存仍在消耗,速度要慢得多.

更新#2

另一半问题与此处描述的问题相同:阻止许多不同的MVC URL填充ASP.NET缓存.设置

<cache percentagePhysicalMemoryUsedLimit="1" …

asp.net caching httphandler servicestack nancy

18
推荐指数
1
解决办法
4115
查看次数

如何扩展ServiceStack身份验证

我正在使用ServiceStack身份验证和ServiceStack.OrmLite(SqlServer).我有不同的用户类型,如学生,教师,校长.所有用户类型将与其他Db表有关系.实施它的最佳做法是什么?

A)向UserAuth表添加必要的字段并制作Black Magic.(创建UserAuth后,手动向表中添加必要的额外信息)

B)学生:UserAuth(将克隆UserAuth中的所有字段)

C)Student.UserAuthId,UserAuth.Meta [UserType.Student,StudentId]互引用

D)扩展XService,XFeature或??

PS:如何将所有者和类型字段添加到ServiceStack UserAuth表.

authentication servicestack

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

Redis IOException:"使用ServiceStack C#客户端强制关闭远程主机的现有连接"

我们有以下设置:

Redis的在Ubuntu Linux 12.04LTE 2.6以下设置一个RackspaceCloud 8GB的实例:

daemonize yes
pidfile /var/run/redis_6379.pid

port 6379

timeout 300

loglevel notice
logfile /var/log/redis_6379.log

databases 16

save 900 1
save 300 10
save 60 10000

rdbcompression yes
dbfilename dump.rdb
dir /var/redis/6379

requirepass PASSWORD

maxclients 10000

maxmemory 7gb
maxmemory-policy allkeys-lru
maxmemory-samples 3

appendonly no

slowlog-log-slower-than 10000
slowlog-max-len 128

activerehashing yes
Run Code Online (Sandbox Code Playgroud)

我们的App服务器托管在RackSpace托管中并通过公共IP连接到Redis(以避免必须设置RackSpace Connect,这是一个皇家PITA),我们通过要求Redis连接的密码来提供一些安全性.我手动将unix文件描述符限制增加到10240,最多10k连接应该提供足够的空间.从上面的设置文件中可以看出,我将内存使用量限制为7GB,以便留下一些RAM空间.

我们使用ServiceStack C#Redis驱动程序.我们使用以下web.config设置:

<RedisConfig suffix="">
  <Primary password="PASSWORD" host="HOST" port="6379"  maxReadPoolSize="50" maxWritePoolSize="50"/>
</RedisConfig>  
Run Code Online (Sandbox Code Playgroud)

我们有一个PooledRedisClientManager单例,每个AppPool创建一次,如下所示:

private static PooledRedisClientManager _clientManager;
public static PooledRedisClientManager ClientManager
{
    get
    {
        if (_clientManager …
Run Code Online (Sandbox Code Playgroud)

.net c# iis redis servicestack

18
推荐指数
1
解决办法
7010
查看次数