我使用ASP.NET WebApi v2创建了一个RESTful Web服务,我使用Swashbuckle为API文档生成了一个swagger UI.
所有API调用都在http:// localhost/api /下,并且swagger UI页面位于http:// localhost/browser/index('browser'部分是可配置的).
浏览到http:// localhost /但是会落在空白页面上,所以我的问题是可以将http:// localhost /路由到http:// localhost/browser/index,这样用户就可以看到API文档只需访问基础uri.
我能想到的一个解决方案是使用一个物理文件系统并创建一个静态的html页面,它会将meta重新定向到我想要的登陆页面,但我想必须有一个更好的方法来做到这一点......
我可以通过以下方式在应用程序模式下启动 chrome chrome.exe --app=http://mywebsite.com
然而问题是,从mywebsite.com打开新窗口的任何链接都会打开一个完整的 chrome 窗口,即带有地址栏、书签等。
是否可以强制 chrome 保持在应用程序模式下,以便所有链接也将在“应用程序模式”窗口中打开。
谢谢
我有一个返回异步枚举器的方法
public async IAsyncEnumerable<IResult> DoWorkAsync()
{
await Something();
foreach (var item in ListOfWorkItems)
{
yield return DoWork(item);
}
}
Run Code Online (Sandbox Code Playgroud)
还有来电者:
public async Task LogResultsAsync()
{
await foreach (var result in DoWorkAsync())
{
Console.WriteLine(result);
}
}
Run Code Online (Sandbox Code Playgroud)
因为DoWork这是一项昂贵的操作,我更喜欢以某种方式并行化它,所以它的工作原理类似于:
public async IAsyncEnumerable<IResult> DoWorkAsync()
{
await Something();
Parallel.ForEach(ListOfWorkItems, item =>
{
yield return DoWork(item);
});
}
Run Code Online (Sandbox Code Playgroud)
但是我无法从内部进行收益回报Parallel.Foreach,所以想知道解决这个问题的最佳方法是什么?
返回结果的顺序并不重要。
谢谢。
编辑:抱歉,我遗漏了一些代码DoWorkAsync,它确实在等待我只是没有将其放入上面的代码中,因为这与问题不太相关。现已更新
Edit2: DoWork在我的例子中主要是 I/O 限制,它从数据库读取数据。
我正在研究一个MSBUILD脚本,为多个版本的wix项目动态注入大量参数,我知道我可以在蜡烛中使用-d开关来提供额外的参数.
然而,我得到了几个警告,类似于"变量'xxx',其值'yyy'先前已声明为值'zzz'",这是可以理解的,因为.wxs我已经为默认构建定义了这些值,然后,构建将在警告之后继续使用.wxs中的值.
所以问题是......可能强制蜡烛覆盖已经在.wxs中的这些参数.
提前致谢.
我使用 ASP.NET Web API 2.2 和 Owin 来构建 Web 服务,并且我观察到对控制器的每次调用都将由在服务器端运行的单独线程提供服务,这并不奇怪,也是我所期望的行为。
我现在遇到的一个问题是,因为服务器端操作非常占用内存,所以如果有超过 X 个用户同时调用,服务器代码很可能会抛出内存不足异常。
是否可以设置全局“最大操作计数”,以便 Web Api 可以对传入呼叫进行排队(而不是拒绝),并且仅在有空槽时才继续。
我无法在 64 位中运行 Web 服务,因为某些引用的库不支持该功能。
我还查看了像https://github.com/stefanprodan/WebApiThrottle这样的库,但它只能根据调用频率进行限制。
谢谢
我正在尝试使用Dictionary来记录Web服务上每个API路径的当前请求数,并增加和减少当前计数我认为一个好方法将使用,Interlocked.Increment()因为它增加了计数并在同一时间读取计数时间.
但是下面的代码给出了一个错误,说ref参数不被归类为变量,我猜是因为dict[key]它不是变量?
var dict = new Dictionary<string, int>();
dict.Add("a", 1);
int i = Interlocked.Increment(ref dict["a"]);
Run Code Online (Sandbox Code Playgroud)
我知道Interlocked.Increment()不能应用于属性,但不会想到通过密钥访问字典会有同样的问题.
最好的方法是什么?
编辑:这里有一些关于此的更多细节.
我正在尝试编写一些代码来限制Web服务的每个API路径上的API调用的数量,因此我有两个字典,策略字典指定每个API路径上允许的并发调用方数和第二个计数字典记录每个API路径上当前有多少呼叫者处于活动状态.
在Web服务执行任何传入请求之前,它将检查上述两个字典,以确定请求是否应该继续,或者只是立即返回HTTP 429(Too Many Requests)响应.
以下是代码的摘录,它首先检查是否存在匹配的策略,然后如果是,则检查是否违反了最大允许请求.
public override async Task Invoke(IOwinContext context)
{
var url = context.Request.Path.ToString();
var policy = _policies.FirstOrDefault(x => x.EndpointPath == url);
if (policy != null)
{
try
{
if (Interlocked.Increment(ref _currentRequests[policy]) > policy.MaxConcurrentConnection)
{
context.Response.StatusCode = 429;
var message = string.Format(
"Max API concurrent calls quota exceeded, please try again …Run Code Online (Sandbox Code Playgroud) 在我的Wix中,我以这种方式包含了大量文件:
<Component Id="mycomponent" Guid="*" Feature="Core" >
<Condition>$(var.Include) = 1</Condition>
<File Id="mycomponent.file" KeyPath="yes"
Source="$(var.BinDir)\mycomponent.file" />
</Component>
Run Code Online (Sandbox Code Playgroud)
所以我可以传入一个不同的var.Include值来为不同的环境生成包.
虽然生成的包看起来确实有效,但是我注意到即使我将它设置为不包含这些组件,包的大小也总是很大.看起来WiX总是包含构建msi的所有组件,并且只有在使用var.Include = 0构建软件包时才选择不安装这些组件...
这是正常行为吗?
在C#我可以使用
var myUser = New User {FirstName = "John", LastName = "Carter"}
Run Code Online (Sandbox Code Playgroud)
实例化一个类并在一个语句中为其成员赋值.
在VB.Net中有相同的东西吗?
原因是WF 4.0只允许设计器中的VB表达式,我想快速创建默认值而不使用一些赋值活动.
非常感谢.
asp.net ×2
c# ×2
wix ×2
.net ×1
asp.net-mvc ×1
asynchronous ×1
installer ×1
msbuild ×1
vb.net ×1
web-services ×1