2010-12-10 169 views
-1

我有一個奇怪的問題,我似乎無法診斷,它似乎是PEBCAC的事情,但我花了很多時間試圖解決它。我創建了一個通過Windows服務託管的WCF服務。這項服務一直工作得很好,我有一個Windows窗體和一個Web界面。該服務最初是在XP上開發的,但我最近已遷移到Windows 7.當我遷移時,我發現該服務的Windows安全性阻止了我在Windows 7上使用我的WinForms應用程序,但它在XP上交談時工作得很好Windows Server 2008 R2,Windows 7和XP上的服務。爲了簡化發展過程中的事情,我完全禁用了安全性,並且我的WinForms應用程序再次在Windows7上運行。WCF無法生成客戶端代理

然後,我對WCF服務進行了一些其他更改,添加方法,更改數據協定等。唯一的端點更改是禁用wshttp的安全性。突然間,更新Web應用程序的服務引用不再創建客戶端代理,但它確實生成了wsdl和xsd文件。我曾嘗試在XP和Win7的新舊服務的衆多組合與結果:

  1. 老服務更新基準時正常工作,無論它運行在XP或WIN7和是否Web應用程序代碼在XP或Win7上。
  2. 新服務不會創建代理,無論是在XP還是Win7上運行,以及Web應用程序代碼是在XP還是在Win7上。我從服務參考更新中得不到任何錯誤,但是,configuration.svcinfoconfiguration91.svcinfo文件沒有列出行爲,綁定或端點。其餘的文件看起來很好。
  3. 我可以使用svcutil來獲取元數據並使用新版本的服務生成代理代碼。
  4. 更新服務引用時,我確實得到了兩個作爲數據協定一部分的項目,它們顯示在對象資源管理器中,但只有其中一個是正確的。我沒有得到任何客戶或其他數據合同對象。
  5. 踢球者是,Windows窗體應用程序工作得很好,包括更新引用和調用服務方法。咦?

我看過新服務中的服務,行爲和端點定義,它們與舊服務相匹配。沒有網上,我可以找到引用這樣的錯誤。我意識到我必須在新代碼中做錯了什麼,但是由於它在WinForms應用程序中正常工作,所以我無法解釋這種差異。

任何幫助將不勝感激。或許我可以保留一些我的頭髮;)

CNC中

閱讀我做了一些調查研究,答案後和嘗試了一些更多的東西:

我已經看過了XSD, etc文件,這些服務沒有任何安全性,並且在事務恢復之後,它們以DataContract屬性的頂級枚舉方式(不具備這些屬性)並且還將安全值恢復到原來的狀態。在這兩種情況下,我都沒有看到任何不妥之處,除了這些文件的命名方式不同:舊的服務引用使用xsd文件,其數字後綴範圍爲2 - 5,而最新的一個使用1 - 4(不能看到這應該影響的東西,因爲svcmap中的指針似乎是正確的)。它確實使事情變得更加困難,但我仔細查看了每個文件,數據似乎是正確的,只是放在了不同的文件中。

WSDL文件,安全恢復到舊值後,除了主機IP和機器名,符合市場預期一致。但configuration.svcinfoconfiguration91.svcinfo仍沒有定義的端點,行爲或綁定。另外,奇怪的是,在確定的兩個數據合約中,只有一個新成員:其數據成員不存在。這是引用標記爲Serializable但未列入DataContract屬性的類的數據合同。唯一改變的地方是我爲該類添加了一個新的字符串成員。更奇怪的是,在xsd文件中有一個合適的數據約定類的定義。

我很困惑。

回答

1

好,很多把玩一下後,我終於想通了這一點。這個問題是由於我在服務中使用了與Web服務中相同的程序集(我在Web應用程序中使用了程序集的不同部分)。這導致了一個類是數據合同的一部分,我修改了該服務的用途,使其在Web應用程序的編譯程序集中與服務發佈時不同。這反過來導致服務引用無法生成客戶端代理。沒有客戶端代理,我的Web應用程序代碼顯示錯誤,所以我從來沒有試過編譯解決方案。簡單的答案是隻在Web應用程序(工作)中構建常用程序集,然後服務引用正確地生成代理。想象一下,我是如何讓一個類的單個數據成員成爲問題的明顯原因,但是它的名稱,數據類型,代碼中的位置等對這個問題沒有影響!無論如何,無論如何,重複使用這個程序集可能是糟糕的設計 - 可能更好地從服務本身消費這些信息。最後一點,winform應用程序工作的原因是因爲我也在winform應用程序中使用了相同的程序集,並且在編譯應用程序時它始終保持最新,所以這些更改從未發生衝突。希望這有助於未來的人。作爲微軟的一個便箋 - 關於這場衝突的任何錯誤信息都會極大地幫助解決問題,儘管我承認這可能不是一種常見的情況。

0

這是一個遠射,但是當您比較生成的xsds時會發生什麼?你期望的差異是什麼,或者是否存在其他一些無意義的奇怪變化?我問,因爲我們發現某些涉及操作頂層的枚舉的合同更改會導致wsdl.exe的行爲不同。它似乎回退到使用XmlSerializer而不是DataContractSerializer,它具有許多副作用,例如類型從列表更改爲數組。不過,我不記得客戶端代碼是否也存在問題。

+0

有趣的是,我正好在頂部水平的變化部分添加一個枚舉,我會在差異比較的XSD,看看還有謝謝 - !。我永遠不會想到這樣的問題,你是怎麼解決你的問題的? – 2010-12-12 02:11:10

+0

我們發現(偶然)一些解決方法。 e是通過將枚舉包裝到其他結構中來將枚舉向下移動。更好的解決方法之一是確保MessageBodyMemberAttribute的Name屬性與枚舉的類型相同。 – 2010-12-13 18:35:18

7

是的,也許你從你的應用程序到您的合同程序集的引用,當你通過生成代理「添加服務引用...」你是在引用程序重用類型,這就是爲什麼你的合同主體不正在生成。 爲了解決這個問題,當你將你的服務引用我建議你點擊「高級」按鈕,那麼你應該在引用程序取消對「再利用型」或者只是從您的應用程序中刪除合同裝配參考。

我希望這項工作爲你

Service reference settings