天天看點

Winform 調用WCF用戶端,所有服務端方法在運作的時候均找不到(編譯沒有問題)

今天在開發過程中遇到了一個很惡心的問題,就是form窗體showdialog的時候,直接報出下面的錯誤:

将斷點加在helpdisplayeditorform_load函數上發現,根本進不到函數内部,就報錯了。

  個人認為是form窗體在showdialog函數之後,helpdisplayeditorform_load函數之前發生的異常,于是上網搜資料,看微軟的源碼,也沒什麼收獲。

  于是,咨詢了一下同僚,同僚說把helpdisplayeditorform_load中的所有代碼屏蔽掉,看看效果。

我把helpdisplayeditorform_load内所有代碼屏蔽到以後,斷點可以進入helpdisplayeditorform_load函數内部了,然後,一部分一部分代碼的放開,發現,隻要到需要調用服務端方法的時候,就會報出上面的錯誤(所有調用wcf服務端方法的地方都會報錯)。

 更新過錯誤提示的dll(通過dll反編譯發現錯誤提示的函數在dll中是存在的),重新開機過iis等等n過方法之後,還有木有搞定。

由于,是所有wcf服務端方法均不可用,于是回頭研究wcf用戶端,發現wcf用戶端有問題,有人在擷取wcf服務端方法的時候,wcf将服務契約辨別方法入參中的自定義類型、傳回值是自定義類型的,均隐式進行了實體類序列化(此處的序列化指的是,将自定義類型的實體,辨別成了wcf資料契約的類型)。

比如spi中的實體類如下:

辨別序列化之後的類的為:

該辨別序列化之後的類在是reference.cs檔案中找到的。

Winform 調用WCF用戶端,所有服務端方法在運作的時候均找不到(編譯沒有問題)

解決方案:

将reference.cs檔案所有辨別序列化的類、枚舉,全部删除,改為引用spi中的實體類、枚舉,然後,重新生成wcfclient,部署,問題搞定。

今天的收獲:

1、斷點沒有進入函數(helpdisplayeditorform_load),并不表示問題,一定在函數之外。

2、資料契約中knowntypeattribute屬性,在同一個類上辨別很多次,如下圖:

Winform 調用WCF用戶端,所有服務端方法在運作的時候均找不到(編譯沒有問題)