我正在使用swagger与servicestack,但我从我的/资源URL获得401未经授权的错误,因为它需要一个API密钥.
除非我记错了,根据文档我应该设置supportHeaderParams为真还有apiKeyName和apiKey从我的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'.
我正在使用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类型的信息吗?
如何在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中有另一种方法可以做到这一点?
我参考ServiceStack文档注册使用POCO:
由于它促进了干净,可重复使用的代码,ServiceStack始终鼓励使用代码优先的POCO来处理所有事情.
即可以使用相同的POCO:
在请求和响应中DTO(在客户端和服务器上)
在JSON,JSV和CSV文本序列化器中
作为OrmLite,db4o和NHibernate中的数据模型
作为存储在Redis中的实体
作为存储在缓存和会话中的blob
在MQ的服务中删除并执行"
我喜欢servicestack以及使用它编写Web服务是多么容易.我试图了解如何最好地设置我的项目,而不是遇到任何问题.
具体来说,我正在与返回响应对象的架构理念作斗争,该对象也是一个数据模型(如SS所建议的).关注分离的想法在我内心过于根深蒂固.如果你对所有事情都使用相同的POCO,那么将不会遇到问题.例如,返回例如视图对象不是"更安全"吗?
使用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?
是否可以在服务堆栈项目中使用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绑定).
我知道ServiceStack提供了一个RequiredRole属性来控制权限,但是,这并不完全适用于我的用例.我的网站有很多用户生成的内容.用户只能编辑他们具有显式权限的文档.每个对象或对象组控制权限.因此,如果用户是组的管理员,则他们可以编辑该组管理的所有文档.
在此per object per user基础上控制对请求的访问的最佳设计模式是什么?我希望尽可能使用DRY方法,因为它会影响我所有API端点的95%.
此外,它是否可以与FluentValidation集成并返回适当的HTTP响应?
非常感谢,
理查德.
我正在比较在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.FileChangeEventHandlerSystem.Web.Configuration.MapPathCacheInfosSystem.Web.CachedPathDatasSystem.Web.Caching.CacheDependencysSystem.Web.Caching.CacheEntrys显然,这些缓存项目让我相信它是一个缓存膨胀问题(我很想摆脱150,000个无法使用的对象!).
在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缓存.
通过反射器挖掘我发现将值设置UrlMetadataSlidingExpiration为零消除了过多内存使用的大部分,代价是将吞吐量减少50%(FileAuthorizationModule类缓存FileSecurityDescriptors,生成时必须有些昂贵,UrlMetadataSlidingExpiration是非零).
这是通过更新web.config并将以下内容放入:
<hostingEnvironment urlMetadataSlidingExpiration="00:00:00"/>
Run Code Online (Sandbox Code Playgroud)
如果可能的话,我将尝试完全禁用FileAuthorizationModule运行,看看是否有帮助.但是,ASP.NET仍然会生成2*N MapPathCacheInfo和CacheEntry对象,因此内存仍在消耗,速度要慢得多.
另一半问题与此处描述的问题相同:阻止许多不同的MVC URL填充ASP.NET缓存.设置
<cache percentagePhysicalMemoryUsedLimit="1" …
我正在使用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表.
我们有以下设置:
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) servicestack ×10
c# ×4
.net ×2
json ×2
architecture ×1
asp.net ×1
caching ×1
guid ×1
httphandler ×1
iis ×1
javascript ×1
nancy ×1
permissions ×1
redis ×1
signalr ×1
swagger ×1
web ×1
webserver ×1