我正在尝试从.net Web API控制器操作中调用客户端方法.
我可以这样做吗?
我能找到的唯一一个接近我要做的就是这个:
在那里,使用GlobalHost.ConnectionManager.GetHubContext从asp.net MVC控制器动作中发送消息.
当我在我的Web API操作中尝试时,不会抛出任何错误,但是从不在客户端调用方法"methodInJavascript".
Public ActionResult MyControllerMethod()
{
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.methodInJavascript("hello world");
// or
context.Clients.Group("groupname").methodInJavascript("hello world");
}
Run Code Online (Sandbox Code Playgroud)
当我在该动作中设置断点时,我看到代码正在被触及并执行.但是在javascript客户端没有任何事情发生.
为什么?Web API是如此不同,以至于这不起作用?有没有其他人尝试过并取得了成功?
当我从我的中心"内部"调用"methodInJavascript"时,它完美地工作.从.net Web API控制器操作中调用时,将无法正常工作.
更新:
在研究这个问题后,我没有解决方案.我只能假设有东西从像这样的例子失踪服务器与SignalR在ASP.NET MVC 4不会通过客户端的消息,这从控制器的WebAPI调用问题枢纽SignalR像也许有一个额外的配置步骤,以使从HubContext调用或者其他的东西.我最初在这里发布的代码就像那些示例中出现的代码没有被证明有任何缺陷.任何人都可以看到代码中的缺陷吗?从html调用工作.我在我的应用程序中广泛使用它,从未遇到过问题.我从未在API控制器工作中看到来自HubContext的调用.没有错误.对客户端没有任何结果.
已解决(种类):
上面的代码确实在发布时起作用.但是,通过localhost在Visual Studio开发环境中不起作用.客户端没有错误但没有结果.将代码原样发布到Web上的真实服务器确实有效.我从没想过会有什么不同所以我从未尝试过.如果它在本地不起作用,则无法发布.它现在正在运行,但我想知道为什么它在开发环境中不能通过localhost工作.无法使用断点等进行本地测试.
我感觉这是signalr虚拟目录.在本地运行和发布时有些不同.不知道什么,但我看到很多帖子,如http://www.bitwisejourneys.com/signalr-hosting-in-iis-a-nasty-gotcha/.现在阅读,看看是否有办法让它在本地和发布工作.
如果我输入参数,我没有成功/错误/完成回调,但Fiddler显示200响应,我的请求的json数据就在那里. 这是关键.Fiddler显示往返是成功的,所请求的数据在客户端并且处于良好状态. 问题是骨干成功/失败/完成未调用.只是得到一个大的东西.
使用完全相同的基本URL,如果我将参数取出(并将其从我的Web服务中并行删除),则会触发成功和完成.下面是我的获取"with"参数:
myModel.fetch({
data: {
name: 'Bob',
userid: '1',
usertype: 'new'
}
}, {
success: (function () {
alert(' Service request success: ');
}),
error: (function (e) {
alert(' Service request failure: ' + e);
}),
complete: (function (e) {
alert(' Service request completed ');
})
});
Run Code Online (Sandbox Code Playgroud)
骨干行为如何不同?它是相同的URL,只有或没有参数.
我猜测的区别在于,在主干fetch的引擎盖下,"with"参数场景是一个帖子而"without"参数是一个简单的get.IE控制台以略微不同的输出反映出这一点.
"使用"参数我的IE浏览器控制台会报告请求需要CORS的警告(不是错误,而是警告):
!SEC7118:XMLHttpRequest for http://example.com/service/myservice.asmx/myoperation?name=Bob&userid=1&usertype=new required Cross Origin Resource Sharing(CORS).
我想它只是告诉我"嘿,你提出了一个交叉来源请求,我让它通过"."没有"这些参数我没有得到那个警告.我确实将服务标头设置为:
Access-Control-Allow-Origin:*
反应的确反过来反映了这一政策.
所以问题是为什么主干成功/错误/完成回调不会触发"带"参数?数据回归.骨干不应该反映成功吗?
我希望了解授权的细节机制,以便为我的情况制定策略.
我的情况是我是分布式应用程序的一部分.我的部分是一个MVC5应用程序,它基本上只包含几个返回单页应用程序视图的控制器.因此,点击控制器A并返回单页应用A.点击控制器B并获取单页应用B.等等.此应用程序不包含数据库或用户数据.完全不同的网站/服务器上的其他一些应用程序.我想询问其他应用程序,如果用户有效或让用户直接询问其他应用程序,并且只有在答案为是时才允许访问我的应用程序视图.所以,实质上,我想基于包含用于登录/用户验证的公开api的远程应用程序的单词来保护我的控制器.
有人向我建议,令牌认证是可行的方法.由于我缺乏经验,这有点令人生畏,但我已经埋没在一些阅读和视频演示中.以下是我目前基于有限理解总结任务的弱尝试.请根据需要更正:
问题:
任何见解将不胜感激.
更新:我在Q2中的意思是,最简单的是,[授权]如何工作?细节?我猜我必须告诉它如何工作.例如,一个愚蠢的例子来说明.如果我想告诉一个装有[Authorize]的控制器让任何拥有用户名"fred"的人,我将如何以及在哪里这样做?我不是在寻找代码.我在概念上思考.我的应用程序必须知道有关令牌的其他应用程序(身份验证应用程序)正在生成.一般来说,我会在MVC应用程序中添加什么来告诉它如何解码这些令牌?我在哪里添加它?有一个标准的地方吗?
我在网上看过类似的帖子,没有任何人建议为我工作.在这一点上,我真的面临着倾倒一个或另一个的选择.
这个"SignalR和MVC 4入门教程":
http://www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalr-and-mvc-4
说你需要两个脚本包括使signalR工作:
<!--Reference the SignalR library. -->
<script src="~/Scripts/jquery.signalR-1.0.1.js"></script>
<!--Reference the autogenerated SignalR hub script. -->
<script src="~/signalr/hubs"></script>
Run Code Online (Sandbox Code Playgroud)
我不知道如何制作第二个,即自动生成的SignalR集线器脚本,发生在require.js中.除非我遗漏了某些东西,否则似乎不是一个可行的require.js语法,用于包含自动生成的脚本.没有它,你会在jquery.signalR-1.1.2.js的第159行得到这个错误:
"JavaScript运行时错误:SignalR:加载集线器时出错.请确保您的集线器引用正确,例如"
jquery.signalR中该点的代码是这样做的:
signalR.hub = {
start: function () {
// This will get replaced with the real hub connection start method when hubs is referenced correctly
throw new Error("SignalR: Error loading hubs. Ensure your hubs reference is correct, e.g. <script src='/signalr/hubs'></script>.");
}
};
Run Code Online (Sandbox Code Playgroud)
有没有人通过require.js实际发生这种自动生成的脚本事件?
一直在研究这个.让我补充一些细节:
我正在使用这种方法 - 构建可扩展的客户端应用程序:(http://johndavidmathis.wordpress.com/2013/04/23/structuring-scalable-client-side-applications/)以构建更具可扩展性的结构.该系列的第二部分"允许模块使用多个文件和一个逻辑文件夹结构" http://johndavidmathis.wordpress.com/2013/04/23/structuring-scalable-client-side-applications/让我分裂我的实际信号器代码输入一个单独的Marionette聊天模块(与我的主app.js文件分开),以实现更好的文件结构.我真的很喜欢这种方法.我的项目的其余部分现在就像这样设置,它在寻找代码方面确实显示出优势.我认为额外的分裂是我被困的地方.似乎无法将第二个依赖项(自动生成的脚本)放入单独的聊天模块文件中.我还在研究这个,但在这一点上我觉得这样.require.js获取我的Marionette应用程序的依赖:
require(["marionette","handlebars", "signalr", "signalr.hubs"], function (Marionette) { …Run Code Online (Sandbox Code Playgroud) c# ×2
controller ×2
access-token ×1
action ×1
ajax ×1
asp.net-mvc ×1
backbone.js ×1
callback ×1
marionette ×1
parameters ×1
requirejs ×1
signalr ×1
signalr-hub ×1