我正在使用Web服务,因此我需要扩展会话长度/重新连接并获取大型数据集等.有时这可能很长,所以我想在一个单独的线程中异步更新UI.
我似乎无法理解使用synchronizationContext在我的UI线程上调用方法.我有它,我已经将我的UIThread上下文传递给我的线程,现在我想更新UI线程上的一些标签等.我已经阅读了很多帖子,但似乎没有解释如何简单地将一些参数传递回方法,或者他们可能会这样做但是我太累了/傻到看到它.
//在主UI线程上
public void updateConnStatus(string conn_name, bool connected)
{
switch (conn_name)
{
case "Conn" : if (connected == true){ //do something} break;
Run Code Online (Sandbox Code Playgroud)
//在单独的线程上
uiContext.Post( //something to do with delegates in here that eludes me );
Run Code Online (Sandbox Code Playgroud)
如果有人可以简单地解释我如何将sendOrPostCallBack链接到原始方法,我将非常感激.
谢谢
编辑:
我设法让代码运行并尝试触发事件,它填充我的自定义eventArgs好,但要么说它没有实例化updateUIConnStatus,需要更多的调查:o
public void updateUIThread(string conn, bool connected)
{
uiContext.Post(new SendOrPostCallback((o) => { updateConnStatus(this, new MyEventArgs<String, Boolean>(conn, connected)); }), null);
}
public class MyEventArgs<T, U> : EventArgs
{
private T _val1; private U _val2;
public MyEventArgs(T value1, U value2) { _val1 = …
Run Code Online (Sandbox Code Playgroud) 我已经阅读了大量描述相同错误消息的类似帖子,但它们似乎与我遇到的情况不符.
我最近开始使用Web API并将我所有的MVC方法都删除了我返回JSON等的地方,因此MVC将只渲染html,我将通过webapi控制器的ajax调用模型.
这是奇怪的事情,我可以从我的家庭apiController获取和POST(所以我可以登录/注册等),但我只能从我创建的区域中的API控制器获取.我得到了405(方法不允许),即使它的装饰和调用方式与其他控制器相同.我想路由是好的,否则它不会返回我的初始获取?
路由
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultAreaApi",
routeTemplate: "api/{area}/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
Run Code Online (Sandbox Code Playgroud)
调节器
// Returns Model
[HttpGet]
public HttpResponseMessage SelectAgent()
// The requested resource does not support http method 'POST'.
[HttpPost]
public HttpResponseMessage SelectAgent(Guid id)
Run Code Online (Sandbox Code Playgroud)
JQuery的
// Works fine
$.ajax({
type: 'POST',
url: '/api/Home/Login',
headers: options.headers,
contentType: "application/json; charset=utf-8",
dataType: 'JSON',
data: ko.toJSON(self.serverModel),
success: …
Run Code Online (Sandbox Code Playgroud) 我目前的服务是使用MVC来渲染表单,WebApi来回移动我的viewModels,使用signalR来推送通知等.
如果用户正在浏览网站,他们将使用表单身份验证,但我们正在推出一些移动应用程序,我希望能够使用基本身份验证从移动应用程序中使用webapi和signalr,而无需维护两个单独的集合控制器.
我有两个IPrincipal,一个SessionPrincipal和一个BasicPrincipal(其中Session Principal继承了BasicPrincipal并有一些额外的上下文数据).这个想法是一些控制器需要在网站上(SessionPrincipal),但网络和移动用户(Basic Principal)都可以访问其他所有控制器.有些人根本不需要任何授权,因此不能拒绝请求.
我目前的方法做了以下步骤来实现这一点(为简洁起见,省略了一些代码)
Global.asax Application_AuthenticateRequest
var cultureCookie = Request.Cookies["Culture"];
// Set culture ...
var authHeader = Request.Headers["Authorization"];
if (authHeader != null && authHeader.StartsWith("Basic"))
{
//Check Username / Password. If okay...
HttpContext.Current.User = new BasicAuthPrincipal(user);
}
else
{
var authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
// Try and resolve Session from encrypted forms auth data. If okay...
HttpContext.Current.User = new SessionAuthPrincipal(Id, User, Agent);
}
}
Run Code Online (Sandbox Code Playgroud)
个人授权过滤器(SessionMVC,SessionApi,BasicApi)基本归结为:
return HttpContext.Current.User as SessionPrincipal != null;
// Or
return HttpContext.Current.User …
Run Code Online (Sandbox Code Playgroud) asp.net-mvc forms-authentication basic-authentication signalr asp.net-web-api
更新2:解决了第一个问题(下面的注释) - 降低了复杂性/范围.
注意:如果使用HttpsBinding从云服务中的自托管WCF服务迁移到Service Fabric,则需要将HostNameComparisonMode从Exact更改为StrongWildcard.
我有这样的场景,我必须打开许多(100+)WCF服务主机来接收来自外部服务的回调.他们有相同的合同,但凭证不同(服务证书对我们每个客户都是独一无二的).
我想知道是否可以通过单个主机/路由器路由所有请求,该主机/路由器可以检查连接的客户端预期服务证书,以及a)欺骗/忽略(最好)服务证书或将连接转发到正确的主机上.
我希望避免在服务结构节点首次出现时加载数百个具有不同凭据的服务主机(存储在数据库中),因此我不会收到尚未加载的服务的流量.理想情况下,我可以在需要时加载它们或者根本不需要加载它们(欺骗证书或其他东西).
寻找一个对WCF有更多了解的人,以了解可能性.谢谢.
为了给这个问题添加前缀,我决定将我们的旧版遗留系统(从vb6,vba,vb.net到40多个程序到c#.net)移动到使用相同DAL的两个独立系统(条形码终端和一个基于网络的系统)因为我花了大部分时间在15年的vba程序中修复糟糕或不存在的业务逻辑.我最近构建了一个完整的实体框架模型,具有流畅的验证,并且在使用它之后对它感到高兴.
小团队熟悉webforms(但不是很),但最近几天我探索了MVC Razor.我喜欢MVC框架,直到我试图开始尝试在同一页面上添加更多功能,然后似乎任意难以复制我放在webform中的最新系统.以前,我会急切地加载客户及其所有子实体,然后将其绑定到客户的单页,以便他们可以访问所有内容(这是他们想要的),它可以正常运行并且不会很慢.从这个单一页面我可以编辑他们所有的帐户详细信息/联系人/电子邮件/电话/工作.
我在MVC中完成和看到的所有示例都处理单个更新,单个编辑等但您肯定无法将每个操作分离到新的视图/页面中?我可以将丰富的模型传递给MVC中的视图,但是尝试更新所有不同的子实体会很痛苦.
这可能是MVC没有设计的确切设计,这是好的,如果MVC将是一个更好的平台,我愿意适应它,但你是如何处理增加这种复杂性的呢?我见过的一些方法:
<forms>
围绕一切包装多个方法并以这种方式处理动作的方法.如果解决方案更轻巧,更易于维护,我将研究我需要的任何东西,我只是想在早期阶段看看我是否在浪费时间.任何指向我应该问的正确问题的指针都将不胜感激.
我目前在Azure网站上使用signalR,只有一个实例将数据推送到客户端.没问题.
我们将项目拆分为单独的web/worker和wcf角色,以便我们可以独立扩展它们.
该网站将这样工作.
情景A.
用户将一些数据提交给Web角色,并将其放入为工作人员A准备的服务总线队列中,向工作人员A发送一条消息,表明已经添加了一个新项目,以防其闲置(以保存轮询).当工作人员A处理它时,将消息发送回Web角色,这些角色会推送到特定客户端.
方案B.
以wcf角色接收数据并将其放入为工作人员B准备好的不同服务总线队列中,wcf角色向工作人员B发送消息,表示已经添加了新项目以防空闲.当工作人员B处理它时,向Web角色发送消息并将其推送给特定客户端.
在下面说明:
我将为用户启用用于Web角色的signalR服务总线背板.我不确定的是如何让我的角色在彼此之间进行沟通.
我需要:
web role =>工人A.
工人A =>网络角色
wcf role =>工人B
工人B =>网络角色
我是否在Web上创建了集线器,工作者A和工作者B都有服务总线主题?然后以某种方式与signalr .net客户端连接?如何在不公开公开的情况下确保它适用于所有Web角色实例?
出于某种原因,数百个客户端通过JavaScript连接到我的Web角色中心似乎很简单,但尝试连接一些内部的客户端,我无法弄明白.
对于我们的新项目,我们必须支持多租户方案.建议每个租户拥有一个应用程序是最安全的模型,因此我们将我们的应用程序逻辑分离为SystemApps和TenantApps
租户服务应通过(内部)访问的地方
织物:/ TenantApps_ {tenantId}/SomeTenantSvc
我们打算使用一个System服务来创建和删除客户端应用程序并检查它们的健康状况.这些应用程序将具有默认服务,该服务依次根据订阅启动/停止其应用程序中的其他服务.
理论上都很好,但我不能为我的生活找到从代码创建新应用程序和服务的位置.我假设它与FabricRuntime有关 - 但更精细的细节让我无法理解.
如果有人能够提供示例或链接到正确的文档,那么我将不胜感激.