作为在Windows Azure上启动WebRole的一部分,我想访问正在启动的网站上的文件,我想在RoleEntryPoint.OnStart()中执行此操作.例如,这将使我能够在加载ASP.NET AppDomain之前影响ASP.NET配置.
当使用Azure SDK 1.3和VS2010在本地运行时,下面的示例代码可以解决这个问题,但是代码有很多黑客攻击,而且在部署到Azure时它不会起作用.
XNamespace srvDefNs = "http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition";
DirectoryInfo di = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory);
string roleRoot = di.Parent.Parent.FullName;
XDocument roleModel = XDocument.Load(Path.Combine(roleRoot, "RoleModel.xml"));
var propertyElements = roleModel.Descendants(srvDefNs + "Property");
XElement sitePhysicalPathPropertyElement = propertyElements.Attributes("name").Where(nameAttr => nameAttr.Value == "SitePhysicalPath").Single().Parent;
string pathToWebsite = sitePhysicalPathPropertyElement.Attribute("value").Value;
Run Code Online (Sandbox Code Playgroud)
如何以在开发和Azure上工作的方式从RoleEntryPoint.OnStart()获取WebRole站点根路径?
我发现approot和sitesroot用于:
\ Approot - 客户的代码,aspx页面,DLL等\ Sitesroot\ - 这是运行完整IIS站点的文件夹.部署角色后,\ Approot中的文件将复制到此\ Sitesroot文件夹,然后IIS将配置为从\ Sitesroot运行该站点.应该在此处放置对角色的任何临时测试更改(web.config更改,新DLL等).
我想知道为什么有两个sparate文件夹,因为它们包含相同的文件?
我一直在使用针对Windows Live和Google的Azure ACS,它一直运行没有任何问题.昨晚我们将实例从1个运行实例扩展到3个,从那以后人们在访问我们的网站时报告了问题.我们已将此跟踪到以下异常情况,该异常情况经常发生.
我们假设我们的配置中存在问题,但不确定我们缺少什么.我们设置机器密钥......
<machineKey decryption="AES" decryptionKey="F7_SOMETHING_SOMETHING_FA" validation="SHA1" validationKey="63_SOMETHING_SOMETHING_BF" />
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释这个问题吗?
System.InvalidOperationException: ID1073: A CryptographicException occurred when attempting to decrypt the cookie using the ProtectedData API (see inner exception for details). If you are using IIS 7.5, this could be due to the loadUserProfile setting on the Application Pool being set to false. ---> System.Security.Cryptography.CryptographicException: Key not valid for use in specified state.
at System.Security.Cryptography.ProtectedData.Unprotect(Byte[] encryptedData, Byte[] optionalEntropy, DataProtectionScope scope)
at Microsoft.IdentityModel.Web.ProtectedDataCookieTransform.Decode(Byte[] encoded)
--- End of inner exception stack trace …Run Code Online (Sandbox Code Playgroud) 我遇到了让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):我有一些想法可以帮助我取得进步,但有些想法非常激烈,所以任何建议都会受到赞赏:
我有一个Web角色,我正在尝试使用模拟器在本地运行.我让它在另一台计算机上工作,但我不能让它在另一台计算机上工作,并且已经远远地重新格式化并从头开始.
当我从Visual Studio启动网站时,Chrome会显示以下消息:
This webpage is not available
The connection to 127.0.0.1 was interrupted.
底部还列出了错误代码:
Error 101 (net::ERR_CONNECTION_RESET): The connection was reset.
构建输出中有一件有趣的事情是这些行:
Starting process 'C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Windows Azure Tools\v1.8\Debugger\WindowsAzureDebugger.exe' with arguments '"C:\Program Files\IIS Express\iisexpress.exe" /trace:error /config:"C:\Users\brian\AppData\Local\dftmp\Resources\159c7254-b7d0-4076-a4fd-820b00feca5f\temp\temp\RoleTemp\applicationHost.config" /site:"deployment18(27).AzureApp.MyApp.Web_IN_0_Web"'...
Process 'C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Windows Azure Tools\v1.8\Debugger\WindowsAzureDebugger.exe' exited with exit code 0.
如果我从命令行运行C:\Program Files\IIS Express\iisexpress.exe" /trace:error /config:"C:\Users\brian\AppData\Local\dftmp\Resources\159c7254-b7d0-4076-a4fd-820b00feca5f\temp\temp\RoleTemp\applicationHost.config" /site:"deployment18(27).AzureApp.MyApp.Web_IN_0_Web",我收到以下消息:
The system cannot find the file specified.
Unable to start IIS Express in background.
我不知道它找不到什么文件,但我已经确认我传递的配置文件确实存在.任何人都知道这里发生了什么?
我们有3个面向公众的Web应用程序,我们正在迁移到Azure.所有站点都使用端口80.
OPTIONS
据我所知,使用Web角色时有三种不同的选择:
1.在单个云服务中以一个Web角色托管的所有3个站点:
ServiceDefinition.csdef2.在单个云服务中托管在SEPARATE Web角色上的每个站点:
ServiceDefinition.csdef3.在SEPARATE云服务中的Web角色上托管的每个站点:
我还缺少其他重要的东西吗?
可能的解决方案
选项1和2的组合.
在一个云服务中托管所有内容:将它们全部发布在一起很好,因为它们都引用了一个需要在所有项目中一致更新的公共库项目.
在一个Web角色中托管两个站点:它们可以很好地扩展.
在其自己的Web角色中托管第三个站点由于大量的峰值需求,它需要自己的扩展.
ServiceDefinition.csdef:
<ServiceDefinition name="WebTestCloudService.Test" xmlns="..." schemaVersion="2012-10.1.8">
<WebRole name="AzureWebTest1" vmsize="Small">
<Sites>
<Site name="AzureWebTest1">
<Bindings>
<Binding name="Endpoint1" endpointName="Endpoint1" hostHeader="test1.mydomain.com" />
</Bindings>
</Site>
</Sites>
<Endpoints>
<InputEndpoint name="Endpoint1" protocol="http" port="80" />
</Endpoints>
</WebRole>
<WebRole name="AzureWebTest2" vmsize="Small">
<Sites> …Run Code Online (Sandbox Code Playgroud) 我们需要使用全新的证书更新我们的Azure云服务.
我给出的那个指定sha256作为签名哈希算法.
我们之前有一个sha1.
当我尝试更新和部署Azure部署时,我得到的错误表明thumprint无效.
错误8 XML规范无效:'thumbprint'属性无效 - 根据其数据类型' http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration:ThumbprintType,值'REDACTED'无效' - 模式约束失败.
在ServiceConfiguration.Cloud.cscfg文件中,XML如下所示:
<Certificates>
<Certificate name="cert" thumbprint="REDACTED" thumbprintAlgorithm="sha1" />
</Certificates>
Run Code Online (Sandbox Code Playgroud)
与thumprint属性squiggly排列为上面的错误.
我尝试过thumbprintAlgorithm = 256,但这不起作用,大概不是一个有效的值.
它需要是sha1吗?Azure可以支持sha256吗?
编辑:我在服务定义模式中找到以下内容,表明允许sha256:
<xs:attribute name="thumbprintAlgorithm" type="ThumbprintAlgorithmTypes" use="required">
<xs:annotation>
<xs:documentation>
The hash algorithm that generates a digest of data (or thumbprint)
for digital signatures such as MD5, SHA1, SHA256. This is different than
the algorithm used in creating the signature inside the certificate.
</xs:documentation>
</xs:annotation>
</xs:attribute>
Run Code Online (Sandbox Code Playgroud)
但是,架构允许的唯一类型值是sha1,如下所示:
<xs:simpleType name="ThumbprintAlgorithmTypes">
<xs:restriction base="xs:string">
<xs:enumeration value="sha1">
<xs:annotation>
<xs:documentation>
Algorithm currently used …Run Code Online (Sandbox Code Playgroud) 我有一个托管在Microsoft Azure Web角色上的Web应用程序.如何禁用RC4密码?
嗨,我正在建立一个云服务,目前有一个网络和一个工人角色.我想要的工作流程是:浏览器调用web角色上的webApi控制器,该角色将消息发送到队列(或服务总线),然后由工作角色处理.到现在为止还挺好.现在,当worker角色完成处理消息时,我想在web角色上调用一个方法,然后谁将向浏览器发出处理已完成的信号(通过SignalR).如果这不是一个正确的问题,请原谅我,因为这更像是一个"最佳实践"问题,而不是一个真正的问题.到目前为止我已经考虑了两种方法:
worker角色使用任务的进度和完成更新表行(在表存储中).Web角色没有信号.浏览器直接读取表存储(通过REST api),因此知道任务何时完成.虽然我不喜欢常规轮询的方法,但我希望有一个"基于事件"的解决方案,但这种方法效果很好(我已经测试过了).此外,一旦客户端获得进程已完成的信息,它必须执行对web api方法的附加调用,以向其他客户端(通过SignalR)广播操作已完成.
将Interrole通信与SignalR一起使用(参见下面的代码示例)也可以工作(已经过测试)
代码示例:
var protocol = "http";
var ipAddress = RoleEnvironment.Roles["XXX.YYY.Web"]
.Instances[0]
.InstanceEndpoints.ToArray()
.Where(ep => ep.Value.Protocol == protocol)
.First()
.Value.IPEndpoint.ToString();
var stringEndpoint = string.Format("{0}://{1}", protocol, ipAddress.ToString());
Trace.WriteLine("Retrieved endpoint address: " + stringEndpoint, "Information");
HubConnection connection = new HubConnection(stringEndpoint);
IHubProxy proxy = connection.CreateHubProxy("MyWebHub");
connection.Start().Wait();
//later...
proxy.Invoke("ProgressUpdated", clientId, progress);
Run Code Online (Sandbox Code Playgroud)
我的问题是:是否还有其他(更好)的方式来沟通方向工作者角色 - > Web角色?也就是说,当一个辅助角色完成处理时,触发Web角色的方法?然后,Web角色上的方法将通过SignalR将更新广播到所有客户端.我还看了一下事件中心,但据我了解,事件消费者仍然会在工作角色上运行.
我在azurewebsites上有一个简单的mvc网站(使用VS互联网模板),与同一数据中心的SQL Azure数据库通信.此时数据库只是用于内置的SimpleMembership Provider.我已经从默认的App_Data mdf文件切换到Azure SQL.它工作正常,但有时一段时间后,它会给:
建立与SQL Server的连接时发生与网络相关或特定于实例的错误.服务器未找到或无法访问.验证实例名称是否正确,以及SQL Server是否配置为允许远程连接.(提供程序:SQL网络接口,错误:26 - 查找指定的服务器/实例时出错)
留言很长:
SQLExpress数据库文件自动创建错误:
连接字符串使用应用程序的App_Data目录中的数据库位置指定本地Sql Server Express实例.提供程序尝试自动创建应用程序服务数据库,因为提供程序确定数据库不存在.要成功检查应用程序服务数据库是否存在并自动创建应用程序服务数据库,必须满足以下配置要求:
但我没有使用SQL Server Express的连接字符串!
立即重新启动网站不会删除错误.
没有改变任何东西并在15分钟后重新启动网站给出:
502 - Web服务器在充当网关或代理服务器时收到无效响应.
您正在查找的页面存在问题,无法显示.当Web服务器(充当网关或代理)与上游内容服务器联系时,它从内容服务器收到无效响应.
以前,我可以通过从VS重新发布将网站恢复到正常工作状态.但是在过去的一个小时里,我尝试过并尝试过,我无法让网站再次运行.
SQL Server Express真的有什么问题?
我的连接字符串部分包含:
<connectionStrings>
<add name="DefaultConnection" connectionString="Server=tcp:sabl6h4---.database.windows.net,1433;Database=MVC;User ID=test@sabl6h4---;Password=----;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;" providerName="System.Data.SqlClient" />
<add name="Entities" connectionString="metadata=res://*/Data.Model1.csdl|res://*/Data.Model1.ssdl|res://*/Data.Model1.msl;provider=System.Data.SqlClient;provider connection string="data source=sabl6h4---.database.windows.net;initial catalog=MVC;user id=test;password=----;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)
为了确保,我将sabl6h4---.database.windows.net复制并粘贴到SSMS中并使用登录测试进行连接,并且没有问题地打开了数据库.
一天后:我创建了一个新的azurewebsite并发布了完全相同的项目和相同的web.config.它没有问题,工作正常.几分钟后,发生了完全相同的错误!
再过三个小时:去吃午饭,回来,点击浏览器刷新按钮,网站再次启动.我确信有人在后端的设置中鬼混.
asp.net-mvc entity-framework connection-string azure-web-roles azure-sql-database
azure-web-roles ×10
azure ×8
asp.net-mvc ×2
.net ×1
acs ×1
c# ×1
cloud ×1
deployment ×1
iis ×1
iis-express ×1
sha ×1
sha256 ×1
ssl ×1