Почему WCF не может быть вызван в wcftestclient? - PullRequest
3 голосов
/ 08 октября 2010

Я создал службу WCF, она хорошо работает в IE addr, но как только я добавляю ее в wcftestclient и вызываю метод, появляется сообщение об ошибке, которое отображается как:

Не удалось вызвать службу.Возможные причины: служба недоступна или недоступна;конфигурация на стороне клиента не соответствует прокси;существующий прокси-сервер недействителен.Обратитесь к трассировке стека для более подробной информации.Вы можете попытаться выполнить восстановление, запустив новый прокси-сервер, восстановив конфигурацию по умолчанию или обновив службу.

Сведения об ошибке:

The Address property on ChannelFactory.Endpoint was null.  The ChannelFactory's Endpoint must have a valid Address specified.
   at System.ServiceModel.ChannelFactory.CreateEndpointAddress(ServiceEndpoint endpoint)
   at System.ServiceModel.ChannelFactory`1.CreateChannel()
   at System.ServiceModel.ClientBase`1.CreateChannel()
   at System.ServiceModel.ClientBase`1.CreateChannelInternal()
   at System.ServiceModel.ClientBase`1.get_Channel()
   at MyDownloadSvcClient.DeleteMyFolder(Int32 UserId, Int32 FolderId)

Файл конфигурации: (обновлено 10/9)

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <services>
            <service name="MyDownloadSvcClient">
                <endpoint binding="basicHttpBinding" />
            </service>
        </services>
        <bindings />
        <client>
            <endpoint address="http://localhost/MyDownloadSvc.svc"
                binding="basicHttpBinding" bindingConfiguration="" contract="IMyDownloadSvc"
                name="Test" />
        </client>
    </system.serviceModel>
</configuration>

Что-то не так?

Заранее спасибо, Элейн

Ответы [ 5 ]

7 голосов
/ 09 октября 2010

Да, определенно что-то не так.Конечная точка службы WCF всегда должна предоставлять ABC - Адрес, Связывание, Контракт.Вы только определяете привязку в своей конфигурации - и это именно то, что говорится в сообщении об ошибке - ваш адрес пуст.

Таким образом, ваш фрагмент конфигурации должен выглядеть примерно так:

<system.serviceModel>
    <services>
        <service name="MyDownloadSvcClient">
            <endpoint 
                address="http://localhost:8888/YourService"
                binding="basicHttpBinding"
                contract="IYourServiceContract" />
        </service>
    </services>

Адрес определяет, где находится конечная точка службы, по какому адресу она доступна для внешнего мира.Если у вас нет адреса, то служба не может общаться с внешним адресом, где.Это там ГДЕ вашего сервиса.Если вы размещаете свою службу в IIS, используя файл * .svc, вы можете оставить этот адрес пустым, поскольку адрес службы определяется сервером и виртуальным каталогом, в котором находится файл * .svc, - но вам все равно необходимо предоставитьaddress="" запись в ваш сервис <service>/<endpoint> tag!

Binding определяет, как сервис взаимодействует - какой протокол, какие настройки безопасности и т. Д. - это HOW вашего сервиса.

И, в конце концов, Контракт определяет (через контракт на обслуживание, как правило, интерфейс в определении вашего сервиса), какие методы (функции) сервиса доступны вызывающей стороне.Вы должны предоставить контракт, иначе вызывающий абонент не сможет узнать, какие методы он может вызвать в вашем сервисе.Это ЧТО службы.

2 голосов
/ 11 февраля 2015

У меня была эта ошибка, и я смог создать файл .svclog и увидеть фактическую ошибку (это было из моего контейнера IOC ... ошибка кодирования. Я не зарегистрировал класс в своем IOC)

См. Статью о MDSN, чтобы узнать, как создать файл .svclog, и просмотрите его: https://msdn.microsoft.com/en-us/library/ms732023.aspx

2 голосов
/ 08 октября 2010

Ваш сервис работает из IE, и ваше имя привязки на клиенте после создания ссылки на сервис начинается с WebHttpBinding_. Так вы пользуетесь сервисом REST? Такая служба не может быть добавлена ​​в качестве справочной службы, и такая служба не поддерживается в WcfTestClient.

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

Почему вы используете пользовательские привязки? Вы не определили протокол или основали свою привязку на существующей привязке. Просто используйте обычный basicHttpBinding.

   <client> 
            <endpoint binding="basicHttpBinding"  contract="IMyDownloadSvc" name="WebHttpBinding_IMyDownloadSvc" address="http://....." /> 
        </client> 

Вам также необходимо указать адрес.

0 голосов
/ 02 апреля 2015

Вы также можете попытаться добавить личность к своей конечной точке:

    <endpoint address ="A" binding="B" contract="C">
      <identity>
        <dns value="localhost"/>
      </identity>
    </endpoint>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...