我正在研究一个系统,其中多个客户端对象需要通过接口实现特定的功能,我希望该函数与continuation异步运行(我希望这些实现是I/O绑定的并且想要确保所有客户端对象尽快完成此功能).我正在使用Visual Studio异步CTP刷新SP1,C#"5.0".
在抽象类的子对象中强制执行异步行为的推荐做法是什么(见下文)?我不能(显然)使用虚方法方法强制使用'异步'方法.我只能要求'任务'返回类型.这是否意味着我不应该尝试在子对象中完全要求异步行为?在这种情况下,返回类型应该简单地"无效"吗?
公共接口现在是系统设计的一个不幸后果,但这是一个单独的问题.显然,我无法限制任何人绕过'BaseFoo'并实现'IFoo'接口的异步.
这是代码:
public interface IFoo
{
void Bar(); //NOTE: Cannot use 'async' on methods without bodies.
}
public abstract class BaseFoo : IFoo
{
public async void Bar()
{
await OnBar(); //QUESTION: What is the right "async delegation" pattern?
}
protected virtual async Task OnBar()
{
await TaskEx.Yield();
}
}
public class RealFoo : BaseFoo //NOTE: May be implemented by 3rd party
{
protected override async Task OnBar()
{
//CLIENT: Do work, potentially awaiting async calls
await …Run Code Online (Sandbox Code Playgroud) 我不认为我做了太深奥的事情,但我没有看到任何其他问题.
下面的代码(我把它简化为要点)在C#4中生成了一个编译器错误.但是,类型参数应该是显而易见的 - 有一个最大的公分母("A类"),它也明确定义在方法"Frob"的返回类型.编译器是否应该在lambda表达式中创建所有返回类型的列表,创建一个祖先树来查找它们的共同祖先,然后将它与包含方法的预期返回类型进行协调?
无法从用法推断出方法'System.Linq.Enumerable.Select(System.Collections.Generic.IEnumerable,System.Func)'的类型参数.尝试显式指定类型参数.
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace Sample
{
public abstract class A
{
private A(int index) { /* ... */ }
public sealed class A1 : A
{
public A1(string text, int index)
: base(index)
{ /* ... */ }
}
public sealed class A2 : A
{
public A2(int index)
: base(index)
{ /* ... */ }
}
private static Regex _regex = new Regex(@"(to be)|(not to be)");
public static IEnumerable<A> Frob(string frobbable) …Run Code Online (Sandbox Code Playgroud) 我有一个Windows服务,它在不同的线程上生成一组子活动,并且只有在所有这些活动都成功完成后才会终止.我不知道在收到停止信号后终止活动需要多长时间.在OnStop()期间,我等待该停止信号的间隔,并且只要系统愿意授予它就继续请求额外的时间.
这是基本结构:
class MyService : ServiceBase
{
private CancellationTokenSource stopAllActivities;
private CountdownEvent runningActivities;
protected override void OnStart(string[] args)
{
// ... start a set of activities that signal runningActivities
// when they stop
// ... initialize runningActivities to the number of activities
}
protected override void OnStop()
{
stopAllActivities.Cancel();
while (!runningActivities.Wait(10000))
{
RequestAdditionalTime(15000); // NOTE: 5000 added for overhead
}
}
}
Run Code Online (Sandbox Code Playgroud)
我应该在RequestAdditionalTime通话中添加多少"开销" ?我担心请求是累积的,而不是基于每次RequestAdditionalTime调用的时间点.如果是这种情况,增加开销可能会导致系统最终拒绝该请求,因为将来它太过分了.但是如果我不添加任何开销,那么我的服务可以在它有机会请求下一个额外时间块之前终止.
我遇到了让SSL在Development Fabric中工作的问题.我正在使用Visual Studio 2012 Ultimate和2012年10月的Azure SDK for .NET运行Windows 8 Pro的全新安装.IIS8没有安装,只有IIS Express,它声称支持HTTPS所以我希望这不是问题.
以管理员身份运行VS 12,我创建了一个空白的VS解决方案,添加了一个新的(.NET 4.5)云服务和一个新的ASP.NET MVC 4 Internet Web应用程序项目,并点击了F5.一切正常.然后,当我向Web角色添加SSL证书并将HTTP端点(端口80)替换为HTTPS端点(端口443,带有证书)时,按F5会产生以下错误消息:
适用于Microsoft Visual Studio的Windows Azure工具
将调试器附加到角色实例'deployment18(32).WindowsAzureCloudService.Mvc4WebRole_IN_0',进程ID为:4892'时出错.无法附加.访问被拒绝.
注意,最后一部分("访问被拒绝")有几种变体,特别令人愉快的是"灾难性的失败".:)
VS Output窗口中的唯一消息('General'输出)是:
Windows Azure工具:警告:在角色"Mvc4WebRole"中将专用端口443重新映射到444,以避免在仿真期间发生冲突.
Compute Emulator UI没有多大帮助; 就在实例消失之前,这是我得到的唯一控制台输出(有时会出现其他消息,但偶尔每隔几次运行;我不知道如何捕获这些):
[fabric]角色实例:deployment18(33).WindowsAzureCloudService.Mvc4WebRole.0
[fabric]角色状态未知
[fabric]角色状态暂停
[面料]角色状态忙
[面料]角色状态不健康
[fabric]角色状态已停止
证书是从CA获得的,并且作为带有私钥,扩展属性的.pfx正确导入到本地计算机/个人/证书存储中,并标记为可导出,以获得它的价值.
当我尝试将服务发布到Azure时,我得到一个关于数据库连接字符串的构建(验证)警告(我认为这是不相关的):
连接字符串'DefaultConnection'在项目'Mvc4WebRole'中使用本地数据库'(LocalDb)\ v11.0'.在Windows Azure中运行此应用程序时,此连接字符串将不起作用.要访问其他数据库,您应该更新web.config文件中的连接字符串.
可能更重要的是,部署实际上在Windows Azure活动日志窗口中失败并显示以下历史记录:
上午9:00:25 - 警告:有包验证警告.
上午9点○○分25秒 - 对于WindowsAzureCloudService准备部署 - 2013年1月3日上午8点59分55秒与订阅ID"<...>"使用服务管理URL"https://management.core.windows.net/ " ...
上午9:00:25 - 连接...
9:00:26 AM - 对象引用未设置为对象的实例.
上午9:00:26 - 部署失败并出现致命错误
有人可以帮我解决这个问题吗?我重新启动了几次.;)
提前致谢!
编辑(1月3日,下午4:44):我有一些想法可以帮助我取得进步,但有些想法非常激烈,所以任何建议都会受到赞赏:
我一直在研究Azure访问控制服务(ACS),它看起来特别擅长处理来自异构(可配置)身份提供程序的身份验证.然后还有一些它似乎支持的其他方案(参见例如ACS How-To).
我的问题恰恰相反:为了正确使用它,它真的有助于我理解ACS 不利于什么.ACS有哪些局限性,和/或哪些情况下ACS不合适?
(假设,为了争论,我计划创建一个 - 盈利的) - 公共Web API和相应的网站前端,托管在Azure中 - 即,我确实关心用户身份.如果您愿意,可以进一步假设我的系统将使用.NET构建.)
谢谢!
我对Repository模式还不熟悉(刚从石器时代回来,大家好:-).我的困境是,我需要开发一种我的Windows应用程序应用程序今天与SQLite(SQLite-Net)一起工作的方式,并在不久的将来解决WCF服务(或一些非直接数据库访问).基本上我想轻松切换我的数据访问层的提供者.
我遇到的最好的网站就是这个博客(http://blog.longle.net/2013/05/11/genericizing-the-unit-of-work-pattern-repository-pattern-with-entity-framework- in-mvc /)但是和其他任何地方一样,它仍然有大量的Entity框架,我认为这种框架不适用于我的情况.
有人可以指出我可以进一步研究的可能的解决方案或参考吗?
谢谢
我有一个OData服务,从/$metadata端点返回以下内容:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx">
<edmx:DataServices xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" m:DataServiceVersion="1.0">
<Schema Namespace="(...)" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">
<!-- ... -->
</Schema>
</edmx:DataServices>
</edmx:Edmx>
Run Code Online (Sandbox Code Playgroud)
当我尝试针对此XML文件运行OData v4客户端代码生成器(v2.3.0)时,出现以下错误:
警告:正在运行转换:根元素的元素'edmx:Edmx'是意外的.根元素应该是Edmx.
警告:未声明" http://schemas.microsoft.com/ado/2007/08/dataservices/metadata:DataServiceVersion "属性.
我也只看到一个空的.cs输出文件.
我已经尝试edmx:从<Edmx>和<DataServices>元素中删除名称空间前缀,使该名称空间成为默认名称,并调整其余元素的前缀,但这也不起作用:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Edmx Version="1.0" xmlns="http://schemas.microsoft.com/ado/2007/06/edmx" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:edm="http://schemas.microsoft.com/ado/2008/09/edm">
<DataServices m:DataServiceVersion="1.0">
<edm:Schema Namespace="(...)">
<!-- ... -->
</edm:Schema>
</DataServices>
</Edmx>
Run Code Online (Sandbox Code Playgroud) 我在Azure网站上使用PluggableAuth和OpenID Connect扩展设置了MediaWiki服务器.后者使用PHP OpenID Connect Basic Client库.我是Azure AD域中的管理员example.com,其中我创建了一个应用程序,其中包含App ID URI,登录URL和回复URL https://wiki.azurewebsites.net/.当我导航到wiki时,我会观察到以下行为(暂时省略cookie值):
客户请求
GET https://wiki.azurewebsites.net/ HTTP/1.1
RP请求
GET https://login.windows.net/example.com/.well-known/openid-configuration
IP响应
(一些回应)
RP响应
HTTP/1.1 302 Moved Temporarily
Location: https://login.windows.net/{tenant_id}/oauth2/authorize?response_type=code&redirect_uri=https%3A%2F%2Fwiki.azurewebsites.net%2F&client_id={client_id}&nonce={nonce}&state={state}
客户请求
(跟随重定向)
IP响应
HTTP/1.1 302 Found
Location: https://wiki.azurewebsites.net/?code={code}&state={state}&session_state={session_state}
客户请求
(跟随重定向)
RP请求(也重复#2和#3)
POST https://login.windows.net/{tenant_id}/oauth2/token
grant_type=authorization_code&code={code}&redirect_uri=https%3A%2F%2Fwiki.azurewebsites.net%2F&client_id={client_id}&client_secret={client_secret}
IP响应
(由MediaWiki解释;我目前没有记录完整的响应)
AADSTS50001: Resource identifier is not provided.
请注意,如果我在步骤8中更改OpenID PHP客户端以提供"resource"参数,则会从AAD获得以下错误响应:
RP请求
POST https://login.windows.net/{tenant_id}/oauth2/token
grant_type=authorization_code&code={code}&redirect_uri=https%3A%2F%2Fwiki.azurewebsites.net%2F&resource=https%3A%2F%2Fwiki.azurewebsites.net%2F&client_id={client_id}&client_secret={client_secret}
IP响应
AADSTS90027: The client '{client_id}' …
我最近用Windows 8 Pro x64和Visual Studio 2012 Ultimate重新保存了我的机器.这通常让我很开心:),除了我在开发过程中因为缺少依赖项或Windows组件而遇到了一些障碍.这个是身份和访问工具(据我所知).
这是我的问题:我创建了一个空白的VS12解决方案,添加了一个ASP.NET MVC 4 Web应用程序,点击F5,一切运行完美.然后,我将项目配置为使用本地开发STS通过闪亮的新向导(所有默认选项),点击F5和...当我被重定向到它时STS无法响应.
初步要求:
GET http://localhost:4826/ HTTP/1.1
Run Code Online (Sandbox Code Playgroud)
来自Web应用程序的响应:
HTTP/1.1 302 Found
Location: http://localhost:12230/wsFederationSTS/Issue?wa=wsignin1.0&wtrealm=http%3a%2f%2flocalhost%3a4826%2f&wctx=rm%3d0%26id%3dpassive%26ru%3d%252f&wct=2013-01-05T04%3a56%3a13Z
Run Code Online (Sandbox Code Playgroud)
如何对无响应的STS进行故障排除?我甚至不知道它在哪里运行.(这是在WIF 4.5之前拥有自己的STS项目的几个好处之一.:))
编辑(1月5日上午9:45):我尝试在IIS中运行Web应用程序,而不是IIS Express - 但没有成功.我还卸载并重新安装了身份和访问工具,没有运气.
我在网上看到的所有屏幕截图都显示了当你开始调试时LocalSTS服务的通知图标; 我还没有看到这个出现.
我还在添加STS配置之前和之后比较了.csproj文件; 我没有看到任何更改,甚至没有添加项目类型GUID.这让我想知道出现了什么问题; 如果项目文件中没有任何内容指定,WIF工具如何知道启动LocalSTS?有任何想法吗?这种机制应该如何运作?
编辑(1月5日,上午10:33):我安装了声明感知MVC应用程序示例并运行它,并且LocalSTS立即启动.但是在比较了项目文件(.csproj,Web.config等)之后,我发现没有任何有意义的差异可以标记WIF工具为一个项目而不是另一个项目启动LocalSTS.至少现在我知道工具安装正确了.关于我应该在哪里看的任何想法?
我正在尝试调用system.out.printlnJNI。我怎样才能做到这一点?这是我到目前为止所拥有的:
jclass cls = env->FindClass("java/lang/System");
jmethodID constructor = env->GetStaticMethodID(cls, "out", "()Ljava.out.PrintStream;");
Run Code Online (Sandbox Code Playgroud) 我有一个旧的 Web 应用程序正在迁移到其他系统,我需要确保现有 URL 重定向到新系统。(我使用的是 ASP.NET MVC2。)
通常,我可以重定向到新网站的主页。但是,如果 URL 链接到特定项目,它们将使用 HTML 书签,如下所示:
http://服务器/旧系统/#itemID
我有一个查找文件和翻译函数,可以从“itemID”转到重定向 URL,并且我可以使用 RedirectResult 完成重定向。
但是如何将锚标记作为查询字符串参数获取到服务器(锚标记不会在 HTTP 请求中发送)?我假设我需要某种客户端 JavaScript 来调用单独的服务器方法,但我不知道如何进行翻译。
(请注意,这样做的全部原因是客户端可能已经存储了某个项目的书签链接。)
谢谢!
我很好奇我是否遇到过C#中的编译器错误.(我正在使用Visual Studio 2013 Update 2.还没有Roslyn.)
以下代码会产生意外警告.年字段(或属性)应该不会,我认为,隐藏在基类中的静态年方法,因为这两个被称为非常不同 - 一个上的一个实例变量和一个类上.我不知道两者如何在名称解析中发生冲突.
我错过了什么?
更新:我知道字段和静态方法具有相同的名称.但是,调用这两个东西的方式是完全不同的,我不知道怎么会有任何混乱.换句话说,从类型系统的角度来看,公共字段"隐藏"基类的公共静态方法似乎是错误的.任何人都可以提供实际存在冲突的场景吗?
public class Timeframe
{
public readonly DateTime From;
public readonly DateTime To;
public Timeframe(DateTime from, DateTime to)
{
From = from;
To = to;
}
public static YearTimeframe Year(int year)
{
return new YearTimeframe(year);
}
// .. similar factory methods, e.g. Month and Day, omitted
}
public class YearTimeframe : Timeframe
{
// WARNING: 'YearTimeframe.Year' hides inherited member 'Timeframe.Year(int)'.
// (a public property w/ private …Run Code Online (Sandbox Code Playgroud) c# ×6
azure ×2
wif ×2
acs ×1
anchor ×1
asp.net-mvc ×1
async-await ×1
asynchronous ×1
c#-5.0 ×1
generics ×1
identity ×1
inheritance ×1
javascript ×1
linq ×1
mediawiki ×1
odata ×1
redirect ×1
sqlite ×1