2009-10-29 45 views
0

我在訪問WCF類庫中的方法時遇到問題,並且想知道是否有人可以解釋爲什麼?使用類庫時無法訪問SOAP方法

我有一個Web項目,它有一個DLL文件 - WebAPILibrary.DLL在它的/ bin文件夾中。 我的網站中的SVC文件指向DLL文件中包含的相應合同。因此,例如,命名空間WebProject.WebAPI.Auth下,我有:

[DataContract] 
    public class Auth 
    { 
     [DataMember] 
     public string LoginUser; 
    } 


    [ServiceBehavior] 
    public class AuthService : IAuthService 
    { 

    string IAuthService.LoginUser(string Email, string Password) 
    { 
      //do some stuff 
    } 

    } 


    [ServiceContract(Namespace="WebAPI.Authentication")] 
    public interface IAuthService 
    { 

     [OperationContract(Name = "LoginUser")] 
     string LoginUser(string Email, string Password); 

    } 

現在,當我實例AuthService AUTH =新AuthService()在我的web項目,我希望auth.LoginUser(字符串電子郵件,字符串密碼)但auth不公開任何我定義的方法。作爲測試,我實例化了IAuthService並獲得我想要的。由於IAuthService是由AuthService實現的,我不應該通過實例化AuthService來做同樣的事情嗎?

另外,當我指向我的任何SVC文件的URL時,它們按預期加載。

謝謝你的時間。

回答

0

,可以稍微修改代碼以下列

[ServiceBehavior] 
public class AuthService : IAuthService 
{  
public string IAuthService.LoginUser(string Email, string Password) 
{ 
     //do some stuff 
}  
} 

在代碼中,你已經明確實現的接口未做訪問修飾符公衆,因此LoginUser方法是可見的,只有當變量的聲明類型是具體界面。 當您使用相同的成員定義實現不同的接口時,這很有用。

public interface ITest1 
{ 
void Hello(); 
} 

public interface ITest2 
{ 
void Hello(); 
} 

明確默認地將Impl

public class Impl : ITest1, ITest2 
{ 
    void ITest1.Hello(){ ... } 
    void ITest2.Hello(){ ... } 
} 

ITest1 obj1 = new Impl(); 
obj1.Hello() // this is calling ITest1.Hello() 

ITest2 obj2 = new Impl(); 
obj2.Hello() // this is calling ITest2.Hello() 

或者隱IMPL只需要有一名成員實現。

public class Impl : ITest1, ITest2 
{ 
    public void Hello(){ ... } 
} 
+0

這肯定是爲什麼該方法沒有顯示,但@Marc_s它發現只是將服務實例化爲「純」.NET類的方法是完全有缺陷的。 –

+0

謝謝。也許我誤解了你以前的建議,我刪除了我的服務引用並使用我的DLL來避免我原來的「衝突錯誤」。我的目的不是將WCF服務用作獨立課程。但是,當我添加我的Web服務引用(當我做我可以看到我的方法)時,我再次出現錯誤:類型'Authentication.IAuthService'存在於'c:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files \ web \ 51fdee26 \ assembly \ dl3 \ WebAPILibrary.DLL'and'c:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files \ web \ 51fdee26 \ App_WebReferences.mzmqypyv.dll 」。 –

+0

快速修復是刪除C:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files 下的所有文件,如果您無法刪除文件(IIS正在鎖定它們),只需運行iisreset命令提示符重新啓動IIS服務器。 –

0

你應該把「公」在「字符串IAuthService.LoginUser(字符串電子郵件,字符串密碼)」前在您的實現,所以它應該是

public string IAuthService.LoginUser(string Email, string Password) 
{ 
    // do some stuff 
} 
1

當你「實例」 IAuthService - 可能是由爲該服務合同創建客戶端代理的方式 - 您可以看到該類的服務合同視圖,例如您將[ServiceContract]上公開的所有內容都顯示爲[OperationContract] - 服務方法。這就是你的服務描述(服務的WSDL)中暴露出來的東西,這與.NET世界中這些方法的可見性完全無關。但是,如果您直接實例化服務類作爲.NET類(而不是通過WCF服務運行時),那麼顯然,您受.NET可見性約束的限制,並且類的成員爲internal默認,例如對外不可見。

因此,基本上,您需要區分是否將您的類視爲WCF服務合約的表示,還是將其視爲經典的.NET類。

馬克

UPDATE:如果你想使用你的DLL「作爲一個WCF服務」,你需要去的WCF客戶端代理的方式,以使用它。這是可以做到幾個方面:

  • 創建使用svcutil.exe從命令行在Visual Studio
  • 客戶端代理,使用「添加服務引用」,讓VS創建客戶端代理爲你
  • 或創建客戶以代碼的形式代理自己 - 並不是很難做到!

在代碼中,你可以做類似

ChannelFactory<IAuthService> factory = new ChannelFactory<IAuthService>(); 

IAuthService proxy = factory.CreateChannel(); 

現在,您proxy類,你應該看到,並能使用Login方法。

爲了使所有的工作,當然,你需要一套正確的配置項和所有在你的web.config。

這是否幫助?

+0

同意100%。一個WCF服務必須放在ServiceHost中,通過應用的各種屬性保證它可能對運行時產生的所有要求。將它實例化爲一個「純」的.NET類和調用方法就是......錯了。 :) –

+0

再次感謝馬克(和德魯)。要回答你的問題Marc,我將我的班級看作是WCF服務合同的表示,而不是.NET班級(這不是我的意圖)。實際上,這個線程是前一個Drew對話框的產物,我的WebAPILibrary DLL在我的/ bin目錄(自動加載)和我的WCF Web服務引用中被引用。顯然,一個與另一個衝突,所以我刪除了WCF Web引用。所以 - 我如何將DLL作爲WCF服務契約引用,並正確地公開這些方法?謝謝你的幫助。 –

+0

對不起馬克 - 我直到現在纔看到您的更新。這確實有幫助 - 我想我在「添加服務引用」時訪問我在我的類庫中創建的端點時一直這樣做。我的代理工作正常,但我正在解決DLL衝突問題(見下文)。但是,就本主題的標題而言,您已回答了我的問題,並表示感謝。 –