这很可能是一个非常长的帖子,试图完全解释我的Azure云服务的部署方式以及我已经尝试解决这个问题,所以请提前道歉并表示感谢.
Framwork:4.5.1
Azure SDK:2.5
Visual Studio:2013 Update 4
问题:
在我尝试加载网页时发布我的Azure Cloud Service时,浏览器将持续加载,从不显示页面或任何错误(没有Web错误代码或.Net错误).无论我是在远程IP还是从-cloudservicename-.cloudapp.net远程登录到Azure本身的VM之后尝试加载网站,这都是相同的行为.部署到Azure时,发布和调试配置都是这种情况.
但是,当在Azure模拟器上本地运行时,应用程序在调试和发布模式下都能正常运行.我的云和本地.cscfg文件之间没有区别,除了VPN配置的NetworkConfiguration部分.
Cloud Service从Visual Studio部署没有错误,我可以RDP到VM并打开IIS等没问题,网站配置和证书看起来很好.
我的应用程序
我的Azure云服务由两个角色组成,一个是托管网站的Web角色,另一个是运行各种后台作业的Worker角色.
这个项目已经有一段时间了,我过去已经从不同的机器上发布了几次迭代.这是我第一次从新的Windows 8.1笔记本电脑上发布,虽然这不应该有所作为.自上一版本以来,配置发生了很小的变化(一个连接字符串添加到角色中).唯一重大的变化是我升级到VS2013更新4(来自更新3)和Azure SDK 2.5(来自2.4).
如果需要,我可以发布配置文件,但是在部署确实有效的情况下,一切似乎都可以.
调查:
我已经采取了许多步骤来尝试调查并解决问题.
RDP到服务器上没有显示任何移民问题,事件日志中没有IIS条目,我自己的日志记录似乎没有任何有用的东西(稍后将详细介绍).
我还启用了Azure诊断程序,但查看返回的日志,没有任何内容突然出现在我身上,因为它是手头问题的日志.
我尝试的下一件事是将远程调试器附加到Azure VM,这可以工作,我可以调试项目.我在Global.asax.vb中处理的所有方法上都设置了断点,包括:
Application_BeginRequest
Application_AuthenticateRequest
Application_Error
Run Code Online (Sandbox Code Playgroud)
在请求页面Application_BeginRequest被立即命中,然后按Application_AuthenticateRequest预期命中.然而,遵循代码通过Application_AuthenticateRequest导致一些奇怪的行为.
在这段代码中我验证了一个FormsAuthenticationCookie,如果发现它将被设置HttpContext.Current.User和Thread.CurrentPrincipal.在这种情况下,cookie没有任何用户没有登录,这意味着该Application_AuthenticateRequest方法完成.此时我可以继续逐步完成.Net框架代码并可以看到成功完成HttpApplication.ExecuteStep.
此时,我希望master_Page_PreLoadMasterPage或我的自定义实现中的方法或其他一个预加载事件Page可以执行,但是没有一个被命中.
在调试中离开进程几分钟后最终Application_Error被命中,这意味着我的日志记录会写出显然导致错误的异常.这很少发生,但是当它发生时我发现了两个不同的错误:
我的日志中的第一个错误:
ErrorCode:SubStatus:暂时失败.请稍后重试.(一个或多个指定的缓存服务器不可用,这可能是由繁忙的网络或服务器引起的.对于内部部署缓存集群,还要验证以下条件.确保已为此客户端帐户授予安全权限,并检查AppFabric允许缓存服务通过所有缓存主机上的防火墙.服务器上的MaxBufferSize也必须大于或等于从客户端发送的序列化对象大小.).附加信息:客户端尝试与服务器通信:net.tcp:// rolename.here:24233 .. GUID:9f85d178-968f-4908-bec4-d1a5f57bb819
在Microsoft.ApplicationServer.Caching.DataCache.ThrowException(ErrStatus errStatus,的Guid trackingId,异常responseException,字节[] []的有效载荷,的EndpointId目的地)在Microsoft.ApplicationServer.Caching.DataCacheFactory.EstablishConnection(IEnumerable'1服务器,RequestBody请求,Func键'3 sendMessageDelegate,DataCacheReadyRetryPolicy retryPolicy)位于Microsoft.Web.DistributedCache的Microsoft.ApplicationServer.Caching.DataCacheFactory.GetCache(String cacheName,CreateNewCacheDelegate cacheCreationDelegate,DataCacheInitializationViaCopyDelegate initializeDelegate)的Microsoft.ApplicationServer.Caching.SocketClientProtocol.Initialize(IEnumerable'1服务器). Microsoft.Web.DistributedCache.DistributedCacheOutputCacheProvider.CreateInternalProvider(IHttpRuntime httpRuntime,OutputCacheI)中的CacheHelpers.RunCacheCreationHooks(CacheConnectingEventArgs fetchingEventArgs,IDataCacheFactory dataCacheFactory,Object sender,EventHandler'1 fetchingHandler,EventHandler'1 fetchedHandler)nitializationData initData,IDataCacheFactory …
在哪里以及如何公开API端点的架构是否有标准?
例如,假设以下API端点可用:
api/companies/
api/companies/{id}/employees/
Run Code Online (Sandbox Code Playgroud)
应该在哪里公开公司和员工资源的架构?
api/company-schema.json和api/employee-schema.json?
api/schemas/company.json和api/schemas/employee.json?
我想提供构建ID作为我的构建中的某些脚本的参数:
但这并没有解析构建的ID.相反,它是按字面意思使用的.见输出:
dotnet publish -c Release -o C:\agent\_work\50\a\MyProject.Api --version-suffix $(BuildID)
Run Code Online (Sandbox Code Playgroud)
为什么是这样?
在为 ASP.NET Core MVC 应用程序启用应用程序日志记录时,我发现每个向 API 发出的请求都记录了许多低级详细信息(请参见下面的示例)。
我发现这会用类似跟踪的细节污染应用程序日志(特别是因为我们每分钟收到数百个请求),使其变得非常难以处理。
有什么办法可以禁用它吗?或者也许我应该寻找另一种日志记录方法?
API 请求的示例 INFO 日志
2017-03-14 09:23:46.944 +00:00 [信息] 请求启动 HTTP/1.1 GET http://example.net/api/something application/json
2017-03-14 09:23:46.944 +00:00 [信息] 成功验证令牌。
2017-03-14 09:23:46.944 +00:00 [信息] HttpContext.User 通过来自 authenticationScheme 的 AutomaticAuthentication 合并:“Bearer”。
2017-03-14 09:23:46.944 +00:00 [Information] AuthenticationScheme:“Bearer”已成功通过身份验证。
2017-03-14 09:23:46.944 +00:00 [信息] 用户授权成功:空。
2017-03-14 09:23:46.944 +00:00 [信息] 执行带有参数的操作方法“Xyz.GetAsync (Xyz.Api)” (["Xyz.Something", "", "", "", " ", "0", "100", "", "2017-06-01T00:00:00Z", "False"]) - ModelState 有效
2017-03-14 09:23:47.115 +00:00 [信息] 执行 JsonResult,写入值“Xyz.Resources.SomeModel[]”。
2017-03-14 09:23:47.115 +00:00 [信息] 在 206.5169 毫秒内执行操作“Xyz.GetAsync …
是否可以在Azure App Service上使用服务器垃圾收集?
我gcServer在web.config(D:\ home\site\wwwroot\web.config)中设置如下:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<gcServer enabled="true" />
</runtime>
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath=".\MyApplication.exe" arguments="" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false" />
</system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)
但GCSettings.IsServerGC仍然返回错误.
.net c# garbage-collection azure-web-sites azure-app-service-plans
我无法将查询中的标量日期值设置为局部变量。我收到以下错误:
SYNTAX ERROR
No tabular expression statement found
Run Code Online (Sandbox Code Playgroud)
询问:
let startTime = toscalar(customMetrics
| where timestamp > ago(1d)
| summarize min(timestamp));
Run Code Online (Sandbox Code Playgroud)
仅运行查询时我得到的结果很好:
我究竟做错了什么?
当我写下面的代码时:
Task<string> task = Task.Factory.StartNew<string>(() => "first task")
.ContinueWith(t =>
{
Console.WriteLine(t.Result);
Console.WriteLine("second task");
});
Run Code Online (Sandbox Code Playgroud)
那是错的!
然后我把它改成这个:
var task = Task.Factory.StartNew<string>(() => "first task")
.ContinueWith(t =>
{
Console.WriteLine(t.Result);
Console.WriteLine("second task");
});
Run Code Online (Sandbox Code Playgroud)
一切都好!
为什么?
"任务任务"和"var任务"之间有什么不同?
我有一个需要按顺序处理的项目列表(但在单独的工作线程上以保持 UI 响应能力)。需要注意的重要一点是,这些项目可以运行很长时间(5 - 10 秒)。
Task<bool> currentTask = null;
foreach (var item in items)
{
var currentItem = item;
// Add a new task to the sequential task queue
if (currentTask == null)
currentTask = Task.Factory.StartNew<bool>(() =>
{
return currentItem.ProcessItem();
}, processCancelTokenSource.Token);
else
currentTask = currentTask.ContinueWith<bool>(t =>
{
return currentItem.ProcessItem();
}, processCancelTokenSource.Token);
// Update UI after each task completes
currentTask.ContinueWith(t =>
{
if (t.IsCanceled)
currentItem.State = State.Cancelled;
else
{
if (t.Result)
currentItem.State = State.Complete;
else
currentItem.State = State.Failed;
} …Run Code Online (Sandbox Code Playgroud) 我需要不断轮询数据存储以获取可能的更新.我使用以下代码实现此目的.顺便说一下,这是一个Windows窗体应用程序.
var uiContext = TaskScheduler.FromCurrentSynchronizationContext();
var updateTask = Task.Factory.StartNew(() =>
{
while (true)
{
Thread.Sleep(5000);
Task.Factory.StartNew(() =>
{
someData = dataStore.GetData();
}).ContinueWith(t =>
{
someGrid.DataSource = someData;
}, uiContext);
}
});
Run Code Online (Sandbox Code Playgroud)
someData是一个私有类字段,someGrid是一个数据网格控件.
这看起来很完美,但我想知道是否有更好的方法来实现它.另外,我的外部任务应该是LongRunning吗?
编辑:
好的,根据Jon和Henk的建议,我使用的是Timer:
uiContext = TaskScheduler.FromCurrentSynchronizationContext();
updateTimer = new System.Timers.Timer(5000);
updateTimer.Elapsed += updateTimer_Elapsed;
updateTimer.Enabled = true;
Run Code Online (Sandbox Code Playgroud)
已逝去的事件:
void updateTimer_Elapsed(object sender, ElapsedEventArgs e)
{
someData = dataStore.GetData();
Task.Factory.StartNew(() =>
{
someGrid.DataSource = someData;
}, uiContext);
}
Run Code Online (Sandbox Code Playgroud) c# ×4
.net ×3
azure ×2
asp.net ×1
asp.net-core ×1
asynchronous ×1
azure-aks ×1
azure-devops ×1
deployment ×1
iis ×1
json-api ×1
jsonschema ×1
rest ×1
task ×1
tfs ×1
winforms ×1