好吧,我必须在这里遗漏一些完全简单的东西,因为我已经在谷歌上搜索了几天,在那里看了几十个答案,而且在这里,我无论如何都无法实现这一点.通过普通HTTP调用时,该服务工作正常.
这是我们的设置......我们有一个域名,http://www.mydomain.com.我们在该域上安装了SSL证书,就像我们保护电子商务网站一样.一切正常,我可以去http s://www.mydomain.com,它的工作正常.我在Windows Server 2003 R2上运行VS2008,.NET 3.5站点.
现在,我向我的站点添加了启用Silverlight的WCF服务,我希望通过SSL进行通信.如果我浏览到http s://www.mydomain.com/myservice.svc,它会向我显示WSDL描述性的" 您已创建服务 "页面,其中显示了使用
svcutil.exe https:// ...
Run Code Online (Sandbox Code Playgroud)
编辑:我意识到在wsdl文件中为svcutil显示的url实际上是指向Web服务器的物理盒名称,而不是正确的域.所以我完成了这篇博客文章中显示的步骤,使用adsutil脚本更新IIS中网站的SecureBinding.现在wsdl文件显示正确的SSL地址,但我仍然得到相同的错误.
现在我去试图挂钩我的Silverlight应用程序,它不起作用,在异步调用的结果中返回一个异常,说" 远程服务器返回错误:NotFound.我的一些博客阅读谈到通过创建测试Windows应用程序将其缩小到Silverlight问题,并试图从中引用它.好吧,我做到了,甚至在试图通过SSL访问服务的常规Windows应用程序中我得到一个例外说明:
System.ServiceModel.EndpointNotFoundException:
There was no endpoint listening at https://www.mydomain.com/mysubdir/myservice.svc that could accept the message.
This is often caused by an incorrect address or SOAP action.
See InnerException, if present, for more details. --->
System.Net.WebException: The remote server returned an error: (404) Not Found.
at System.Net.HttpWebRequest.GetResponse()
at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
Run Code Online (Sandbox Code Playgroud)
尽管我使用HTTPS方案明确地将服务引用添加到Windows应用程序,但它正确地获取了所有方法,并在编辑器中的Intellisense中显示它们.
请注意,这是一项不需要在用户身上显式登录的服务.我将在我的SOAP信封中发送自定义标头,以验证请求是否来自我们的应用程序,我只想让掠夺者嗅探线并挑出自定义标头.
现在到代码,我必须有一些愚蠢的小设置错误,因为从我读过的所有内容,这应该是一个相当简单的练习.
首先,我的服务的代码隐藏类使用以下属性进行修饰:
<ServiceBehavior(AddressFilterMode:=AddressFilterMode.Any)>
<AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Allowed)>
Run Code Online (Sandbox Code Playgroud)
我在服务器上的web.config的ServiceModel部分如下所示:
<system.serviceModel> …Run Code Online (Sandbox Code Playgroud) 我一直在使用Silverlight,Web服务和轮询构建客户端/服务器应用程序.当我第一次研究这个主题时,显然我错过了整个双工通信的事情.无论如何,我在这个主题上看到的MSDN文章很有希望.
在研究可扩展性时,似乎对该主题存在冲突的意见.
silverlight.net/forums/t/89970.aspx - 此线程似乎表明双工轮询仅支持服务器端的有限数量的并发客户端.
dotnetaddict.dotnetdevelopersjournal.com/sl_polling_duplex.htm - 这个博客条目出现在多个地方,所以它混淆了水域.
silverlight.net/forums/t/108396.aspx - 这个帖子表明我并不是唯一有这种担忧的人,但是没有答案.
silverlight.net/forums/t/32858.aspx - 尽管所有的坏消息,这个线程似乎有一个官方的回应说10个并发连接是每台机器.
简而言之,有没有人有事实/基准?
谢谢 :)
WCF跟踪日志显示许多"The server has hit a PollingDuplex throttle, MaxSessionsPerAddress, and cannot accept another session from this client. An http error was returned"错误.
找不到有关MaxSessionsPerAddress设置的足够详细信息,只是发现这篇帖子MaxSessionsPerAddress总是说是10不能改变的.
只是在想可能是这个问题涉及到我的客户端代理,在这样的问题,一些超时结果实现它们共同容错逻辑:在通道故障WCF客户端代理的情况下关闭一个通道(关闭(),然后Aboort()在尝试/捕获),然后尝试重新连接每5秒,N次重试.也许客户端甚至在10次重试之后仍然无法连接在服务上创建了10个会话,因此所有下一次重试都被拒绝了?
一般信息:
WCF客户端:
WCF服务器:
任何帮助非常感谢!
不能udnerstand为什么PerSession/ WCF服务的类型构造函数调用两次.ConcurrencyMode是Multiple.只需启动五个同时执行相同WCF服务方法调用的客户端,在日志中我看到static构造函数被调用两次,第一次和第二次使用另一个后第二次调用3秒ProcessId/ThreadId.在构造函数本身和WCF跟踪日志中都没有例外.每个日志的构造函数执行时间约为10毫秒.这导致所有静态字段不在假设的所有服务实例之间共享,并且在5个客户端连接的情况下,我有5个服务和两个不同的静态上下文,因此所有服务都没有反映onse静态字段的变化.
由于我依赖于在多个服务实例之间共享的一些静态缓存,因此这个问题混淆了许多事情.
服务托管在IIS.没有IIS重新启动,AppPool会在此时间间隔内重复使用.
[AspNetCompatibilityRequirements(RequirementsMode =
AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(
InstanceContextMode = InstanceContextMode.PerSession,
IncludeExceptionDetailInFaults = true,
ConcurrencyMode = ConcurrencyMode.Multiple)]
public class WcfService
{
private static readonly ILog logger;
private static volatile bool typeInitialized;
static WcfService()
{
try
{
// Here is typeInitialized is false in both calls
logger = LogManager.GetLogger("LogName");
logger.InfoFormat("[PID:{0}] [THID:{1}] BEGIN Static constructor",
Process.GetCurrentProcess().Id,
Thread.CurrentThread.ManagedThreadId);
}
catch (Exception exception)
{
logger.Error("error on type construction stage", exception);
}
finally …Run Code Online (Sandbox Code Playgroud) wcf ×4
c# ×3
silverlight ×3
.net-4.0 ×2
https ×1
polling ×1
ssl ×1
wcf-binding ×1
web-services ×1