Проблема при вызове службы WCF, которая вызывает другую службу WCF - PullRequest
3 голосов
/ 04 октября 2010

У нас есть требование для вызова службы WCF из другой службы WCF. Чтобы проверить это, я создаю пример консольного приложения для отображения простой строки. Настройка: Консольное приложение -> Служба WCF 1 -> Служба WCF 2 Консольное приложение вызывает метод службы 1, а метод службы 1 в конечном итоге вызывает метод службы 2 для возврата строки. Я могу вызвать Консоль -> Сервис 1, но Сервис 1 -> Сервис 2 не работает. Выдает исключение: «Не удалось найти элемент конечной точки по умолчанию, который ссылается на контракт« ITestService2 »в разделе конфигурации клиента ServiceModel. Это может быть связано с тем, что для вашего приложения не найден файл конфигурации или из-за того, что в элементе клиента не найден элемент конечной точки, соответствующий этому контракту». Для этого я создал службу WCF 2 с одним методом, который возвращает строку (ничего особенного).

namespace TestServices
{
    [ServiceContract]
    public interface ITestService2
    {
        [OperationContract]
        string GetSomething(string s);
    }
}

Затем я создаю service1 - ITestService1.cs и TestService1.cs, который использует метод service2 GetSomething ().

namespace TestServices
{
    [ServiceContract]
    public interface ITestService1
    {
        [OperationContract]
        string GetMessage(string s);
    }        
}

namespace TestServices
{
    class TestService1 : ITestService1
    {
        public string GetMessage(string s)
        {
            TestService2 client = new TestService2();
            return client.GetSomething("WELCOME " + s);
        }
    }
}

Примечание: я создаю прокси для Service2, используя svcutil.exe. Он создает файлы app.config и TestService2.cs, которые я скопировал в папку проекта TestService1 для ссылки.

Наконец, я создал консольное приложение, которое просто создает экземпляр Service1 и вызывает метод GetMessage ().

static void Main(string[] args)
{
    TestService1 client = new TestService1();
    Console.WriteLine(client.GetMessage("Roger Harper"));
    Console.ReadKey();
}

Когда я вызываю службу 2 непосредственно из консольного приложения, она работает без каких-либо проблем. Тот же конфиг и класс прокси при копировании в сервис 1. Выдает ошибку. Файл конфигурации выглядит так: файл конфигурации для службы 1 в консольном приложении:

<configuration>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_ITestService1" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                    allowCookies="false">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="false" />
                    <security mode="Message">
                        <transport clientCredentialType="Windows" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="Windows" negotiateServiceCredential="true"
                            algorithmSuite="Default" establishSecurityContext="true" />
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:3227/WCFTestSite/TestService1.svc"
                binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ITestService1"
                contract="ITestService1" name="WSHttpBinding_ITestService1">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>

файл конфигурации для службы 2 в папке service1:

<configuration>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_ITestService2" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                    allowCookies="false">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="false" />
                    <security mode="Message">
                        <transport clientCredentialType="Windows" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="Windows" negotiateServiceCredential="true"
                            algorithmSuite="Default" establishSecurityContext="true" />
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:3227/WCFTestSite/TestService2.svc"
                binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ISriWCFTestService2"
                contract="ITestService2" name="WSHttpBinding_ITestService2">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>

Благодарим вас за помощь в решении этой проблемы. Я также попытался добавить префикс имени к пространству имен, но это не сработало. Не уверен, как тот же конфиг / прокси работает напрямую с консоли, а не с другим сервисом. Пожалуйста помоги!!! Заранее спасибо.

1 Ответ

1 голос
/ 04 октября 2010

Насколько я понимаю, у вас есть консольное приложение, которое самостоятельно размещает службу wcf, и эта служба вызывает вторую службу wcf. Я предполагаю, что у вас есть wcf service1, определенный в dll, который консольное приложение загружает, а затем пытается вызвать. Я думаю, что ваша проблема может заключаться в том, что служба sice 1 находится в dll, она не загружает файл конфигурации, в котором вы определили ссылку на службу 2. Попробуйте программно создать конечную точку и посмотрите, поможет ли вам решить эту проблему.

...