2014-09-09 37 views
5

WCF hizmetim için istemci olarak bir hizmet monikeri başarıyla oluşturdum. Ama ben moniker üzerinde herhangi bir yöntem arayamıyorum.Otomasyon Hata WCF mex'te Moniker ile yöntemi çağırırken Excel 1.

Public Function TestMethod(ByVal TestValue As String) As String Implements ICustomerService.TestMethod 
     Return "You said.... " & TestValue 
    End Function 

ardından kod Excel'de Moniker oluşturur: aşağıdaki gibi WCF hizmeti sonunda

Ben, TestMethod adlı bir kukla yöntem var.

Public Sub WCFMexMonkierDemo() 
    ' Create a string for the service moniker including the content of the WSDL contract file 
    Dim mexMonikerString As String 
    mexMonikerString = "service:mexAddress='http://localhost/CustomerService.svc/mex'" & _ 
         ", address='http://localhost/CustomerService.svc'" & _ 
         ", binding=CustomerServices.CustomerService" & _ 
         ", bindingNamespace='http://tempuri.org/'" & _ 
         ", contract=ICustomerService" & _ 
         ", contractNamespace='http://tempuri.org/'" 

    ' Create the service moniker object 
    Dim mexMoniker, result 
    Set mexMoniker = GetObject(mexMonikerString) 

    result = mexMoniker.TestMethod("client call")  '<-- error on this line 
    'Set result = mexMoniker.TestMethod("client call") 
    MsgBox result 

    Set mexMoniker = Nothing 
    Set result = Nothing 
End Sub 

Yukarıdaki kod lakap başarıyla oluşturuldu ima GetObject çağrı kadar çalışır. Ama herhangi bir yöntemi çağırmaya çalıştığım anda hata alıyorum.

Automation Error

WCF yöntemi

Microsoft WCF test istemcisi ve diğer WCF müşterilerle mükemmel ok çalışır. Bu yüzden servisin kendisinde bir problem olmadığını biliyorum.

cevap

1

Aynı problemle karşılaşan herkes için çözüm budur. Sorunun sebebini kendim biraz araştırma yaparak öğrendim, ve aşağıda bunun için ne yaptım.

Problem ait

Nedeni (Öyle görünüyor) WCF hizmetlerine bağlanmak için bir lakap dizesi kullanarak COM arabirimleri kullanmak (sınıflar, yapılar, diziler gibi vs) karmaşık türleri ile ilgili sorunlar programları. Sadece basit tiplerle çalışabilirler (string, integer, decimal, boolean vb. Gibi). Yöntem bağımsız değişkenleri veya döndürme türündeki karmaşık türler çalışmaz.

Aramak istediğiniz yöntem, yöntem bağımsız değişkenlerinde veya döndürme türünde hiçbir karmaşık türde olsa bile, hizmette en az bir yöntem varsa çalışmayacaktır. Benim durumumda, ilgilendiğim yöntemlerin, yöntem argümanları veya dönüş türleri olarak herhangi bir karmaşık türü yoktu. Benim Çözüm

Kolay olduğunu etrafında bir çözüm bulma, sorunlara neden ne öğrendim kez

. İlgilendiğim yöntemler için ayrı bir WCF hizmeti (arayüz) oluşturdum ve kamuya açık kompleks tipler olmadığından emin oldum, yani yöntem tanımında karmaşık tipler yok - metod argümanları ve dönüş türleri.

Sonraki Diğer WCF servislerinde olduğu gibi bu arabirimi uygulayan bir sınıf oluşturdum. Bu sınıfı orijinalinden aldım, böylece orada uygulanan tüm iş mantığını tekrarlamama gerek yok. Bu sınıfın çözdüğü tek amaç, karşı karşıya kaldığım sınırlamayı aşmak. İçinde sınırlı sayıda yöntem bulunan orijinal sınıfın etrafındaki sarıcıydı. Yöntemler, temel sınıf eşdeğer yöntemini çağırdı ve sonuçta çıkan çıktıyı doğrudan istemciye iade etti.

Daha sonra bu yeni hizmeti barındırmak için app.config dosyamı değiştirdim ve hizmet adresini bu yeni hizmet adresiyle moniker dizesinde değiştirdim. Yani, temel olarak iki WCF servisine ev sahipliği yaptım - biri karmaşık türleri tüketebilen müşteriler ve diğeri yapamayanlar için.

Bu gerekli olan her şeydi ve her şey yolunda gidiyor.:)


bu sadece kendi gözleme dayanır ve yanlış olabileceğini NOT. Kaybettiğim bir şey olabilir ve bu sorunun üstesinden gelmek için daha iyi yollar olabilir. Durumun bu olduğunu düşünüyorsanız, yorumunuzu paylaşın veya çözümünüzü paylaşın.

İlgili konular