WCF入門 (14)


前言

上周去面試,跪了,這一年沒什么長進,還是挺慚愧的。

得到的評語是:想的太多,做的太少。

 

做了一份面試題,最后一題是數據庫的,寫個查詢。要查出Score有兩次及兩次以上超過79的Name和他的最高得分,同時顯示超過79分的次數。

表內容如下:

微信截圖_20151014232023

直接上Sql答案了。

兩種寫法:

1. 最簡單的方法,好像是萬能的,表不斷嵌套

select * from (
	select Name, max(Score) as maxScore,count (name) as cnt from (
		select * from Student where Score>79) 
	as S1 group by Name) 
as S2 where S2.cnt>=2

最內層篩選出分數大於79的,取個別名S1,然后把S1結果用Name分組,然后得到每組的Name,max Score, count(name),然后結果取別名S2,然后用cnt過濾S2的cnt,得到超過2次的結果集合。

2. 用個with 來寫CTE,然后用一下having關鍵字。

with S1 
as 
(
	select * from Student where Score >79
)

select name, MAX (score) as maxScore, COUNT (name) as cnt from s1 group by name having COUNT (name)>=2 

寫法好看了點,效率我也不知道怎么分析。。。有同學願意幫忙分析一下效率嗎。。。

執行上面兩個查詢,結果如下:

QQ截圖20151014234119

好了,言歸正傳,WCF入門。

第14集 實現IExtensibleDataObject接口所冒的風險 Risks of implementing IExtensibleDataObject interface

上一集,我們給DataContract 實現了IExtensibleDataObject接口,這個接口的ExtensionData屬性可以用來保存客戶端傳過來的額外的內容,當服務端把實體類序列化成xml回傳給客戶端時,會一並序列化這個屬性里面的內容,就可以避免客戶端的數據丟失。但是,這樣做有個缺點:

  容易被DoS攻擊,因為這些額外的數據是保存在內容中的,如果客戶端傳過來一個較大的Object,那樣就會在服務器上占用大量的內存,服務器會因為內存不夠而無法提供正常的服務。

所以,現在的問題就是如何關閉這個特性。有下面幾種方法。

1. 最簡單的,DataContract類不實現IExtensibleDataObject接口,或者說移除DataContract類的IExtensibleDataObject接口實現,這樣做可以是可以,但是假如我們有很多個DataContract都實現了這個接口,那么就要所有的都移除,比較麻煩。

2. 改配置文件的方式。 如下:

    <behaviors>
      <serviceBehaviors>
        <behavior name="mexBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <dataContractSerializer ignoreExtensionDataObject ="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>

給behaviors節點dataContractSerializer 增加一個ignoreExtensionDataObject ="true".

3.同理,也可以通過編程的方式實現。

[ServiceBehavior(IgnoreExtensionDataObject=true)]
public class EmployeeService : IEmployeeService
{...}

 

這集就這么點東西,Thank you。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM