- 類型:源碼相關(guān)大。79KB語言:中文 評分:5.0
- 標(biāo)簽:
立即下載
新項目中使用了WCF 實現(xiàn)客戶端與服務(wù)器的通訊。c/s架構(gòu),客戶端采用winfrom實現(xiàn)。項目試運行期間,很多用戶都抱怨系統(tǒng)總是無法正常登錄。
查看日志發(fā)現(xiàn)如下異常信息:
System.ServiceModel.Security.MessageSecurityException: 從另一方收到未進(jìn)行安全處理或安全處理不正確的錯誤。有關(guān)錯誤代碼和詳細(xì)信息,請
參閱內(nèi)部 FaultException。 ---> System.ServiceModel.FaultException: 消息中至少有一個安全令牌無法驗證。
WCF通訊采用了UserName安全認(rèn)證方式,用Google大神搜索一番,上述異常多是因為客戶端與服務(wù)器端時間不同步所引起的,WCF所提供的幾種Binding客戶端和服務(wù)端所允許的時間差可以是5分鐘.
原因找到了,下面就是如何解決了,網(wǎng)上大多數(shù)方法是使用 命令:net time \\IP地址或服務(wù)器名 /set /yes 去同步客戶端的時間,這種方式我直接給Pass掉了,原因如下:
通過跟用戶的交流發(fā)現(xiàn)很多用戶是故意將時間提前或推后十幾分鐘的,原因很多就不詳細(xì)列具了。
繼續(xù)找其它解決方案,在國外一個論壇上發(fā)現(xiàn)可以使用customBinding 修改允許的最大時間偏差。let's try it!
修改前的配置文件(刪減了一些配置節(jié))如下:
04
|
<service name="userService">
|
05
|
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="Binding_user"
|
10
|
<binding name="Binding_user">
|
11
|
<security mode="Message">
|
13
|
<message clientCredentialType="UserName" />
|
18
|
</system.serviceModel>
|
1
|
將wsHttpBinding替換為customBinding后配置文件如下:
|
04
|
<service name="userService">
|
05
|
<endpoint address="" binding="customBinding" bindingConfiguration="MyCustomBinding"
|
11
|
<binding name="MyCustomBinding">
|
13
|
<security authenticationMode="UserNameForSslNegotiated">
|
14
|
<secureConversationBootstrap>
|
15
|
<localClientSettings maxClockSkew="00:59:00" />
|
16
|
<localServiceSettings maxClockSkew="00:59:00" />
|
17
|
</secureConversationBootstrap>
|
18
|
<localClientSettings maxClockSkew="00:59:00" />
|
19
|
<localServiceSettings maxClockSkew="00:59:00" />
|
22
|
<readerQuotas maxStringContentLength="500000"/>
|
23
|
</textMessageEncoding>
|
24
|
<httpTransport maxReceivedMessageSize="10485760" maxBufferPoolSize="524288" />
|
28
|
</system.serviceModel>
|
1
|
到這里還不算完,以上只是修改的服務(wù)端配置文件,在客戶端的app.config文件中同樣要修改,客戶端配置修改后如下:
|
04
|
<binding name="MyCustomBinding" closeTimeout="00:01:00"
|
05
|
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
|
08
|
<security authenticationMode="UserNameForSslNegotiated">
|
09
|
<secureConversationBootstrap>
|
10
|
<localClientSettings maxClockSkew="00:59:00" />
|
11
|
<localServiceSettings maxClockSkew="00:59:00" />
|
12
|
</secureConversationBootstrap>
|
13
|
<localClientSettings maxClockSkew="00:59:00" />
|
14
|
<localServiceSettings maxClockSkew="00:59:00" />
|
17
|
<readerQuotas maxStringContentLength="500000"/>
|
18
|
</textMessageEncoding>
|
19
|
<httpTransport maxReceivedMessageSize="10485760" maxBufferPoolSize="524288" />
|
24
|
<endpoint address="http://********/user.svc" binding="customBinding"
|
25
|
bindingConfiguration="MyCustomBinding" contract="Iuser"
|
26
|
name="CustomBinding_Iuser" />
|
28
|
</system.serviceModel>
|
OK,完工,初次寫博,盡請拍磚。