client web.config如下
server web.config
<system.serviceModel> <bindings> <wsHttpBinding> <binding name="WSHttpBinding_OMSService" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:01:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="20000000" maxReceivedMessageSize="20000000" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"> <readerQuotas maxDepth="32" maxStringContentLength="20000000" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> <reliableSession ordered="true" inactivityTimeout="00:20:00" /> <security mode="Message"> </security> </binding> </wsHttpBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="metadataBehavior"> <serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:1888/OMSService/Metadata" /> <serviceThrottling maxConcurrentCalls="1000" maxConcurrentInstances="1000" maxConcurrentSessions="1000"/> </behavior> </serviceBehaviors> </behaviors> <services> <service name="OMS.Server.Services.OMSService" behaviorConfiguration="metadataBehavior"> <endpoint bindingConfiguration="WSHttpBinding_OMSService" address="http://127.0.0.1:1888/OMSService" binding="wsHttpBinding" contract="OMS.Server.Contracts.IOMSService"> </endpoint> </service> </services> </system.serviceModel>
FaultException的具体内容是啥?
客户端和服务器的安全设置要保证一致。
<reliableSession ordered="true" inactivityTimeout="00:20:00"
enabled="false" />
<security mode="Message">
<transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true"
algorithmSuite="Default" />
</security>
是不是报错后,关闭通道后再访问就又好了?
哦 我再去看一下。 顺便问一下 客户端是网页的wcf应用是不是服务端一定是不能回调客户端的方法的?
报错后,我重新登录网站就还可以,等几分钟就又报错
@koi: 从目前看来是这样的,因为要实现回调的话,一是使用tcp,那么网页就必须在浏览器端保持一个tcp的连接存活。而是用http,那么网页就必须在浏览器端启动一个端口监听。所以只能用长轮询的模式来实现服务器推,最近有个websocket的技术,没研究过,你也可以试试。wcf 5.0也支持web socket了。
@程序猿.码农: 一般来说,是因为服务器已关闭此安全会话通道,而客户端仍然在使用造成的。
@程序猿.码农: 出了session时间的限制 还有没别的什么时间限制会影响通道?
@koi: 目前暂时没有。
@程序猿.码农: 那下面的 userCallback 没用的吗(如果不可以调用客户端的方法)?
IService:
[OperationContract(AsyncPattern = true)]
IAsyncResult BeginAsy(string fileName, AsyncCallback userCallback, object stateObject);
string EndAsy(IAsyncResult asynResult);
@koi: 你说的是服务器端异步,因为你说回调客户端,我就以为你说的是回调契约。服务器端异步是支持的,但是这个 userCallback 不是调用客户端的方法,该 userCallback 是服务器端异步操作完成后的通知操作,用于对异步调用完成后的结果作一些同步处理.
userCallback 的一切都只会发生在服务器端,同时也不会跟客户端有任何关系。
@程序猿.码农:
服务端Service(实现上面的Iservice):那在BeginAsy里要返回一个实现了IAsyncResult接口的类的对象,在asp.net里是保持长连接是AsyncCallback 对象不调用的话连接就不返回,而现在wcf服务端有EndXXX方法(这个例子里是EndAsy,调用完这个方法就返回了吧,这个方法是一定会调用),怎么保持这个链接?
@koi: 在服务器端,保持连接的方式就是不调用 userCallback.
@程序猿.码农: 但是调用了EndAsy方法后就算没有调用userCallback结果也是返回了(这个时候连接还没返回的吗?)
@koi: EndAsy是被WCF调用的,触发 WCF 调用 EndAsy 的是你在 BeginAsy 中返回的 IAsyncResult .因此在你实现 IAsyncResult 的时候,你可以控制什么时候由IAsyncResult.AsyncWaitHandle 发出完成指令。
@程序猿.码农: 哦 谢了