Невозможно использовать службу WCF из Windows Mobile 5: конечная точка не найдена - PullRequest
1 голос
/ 29 апреля 2010

Я пытаюсь выяснить, как вызвать службу WCF со смартфона Windows. У меня очень простое консольное приложение для смартфона, которое только запускает и делает 1 звонок в сервис. Служба просто возвращает строку. Я могу создать экземпляр прокси-класса, но когда я вызываю метод, он выдает исключение:

Конечная точка не прослушивала http://mypcname/Service1.svc/basic что мог принять сообщение. Это часто вызвано неправильным адресом или действие SOAP. Смотрите InnerException, если настоящее время, для более подробной информации.

Внутреннее исключение:

Не удалось установить соединение с сеть.

Я пытался следовать этому руководству по настройке служб с помощью Windows Mobile.

Я использовал NetCFSvcUtil для создания прокси-классов. У меня есть служба, работающая на IIS на моей машине, и Util использует wsdl из этого места. Я создал базовую http-привязку, как предложено в статье, и я думаю, что указал прокси на правильном URI.

Вот некоторые разделы соответствующего кода на случай, если это будет полезно увидеть. Если у кого-то есть какие-либо предложения, я был бы очень признателен. Я не уверен, что еще я могу ткнуть, чтобы заставить эту вещь работать.

Спасибо!

Клиент, (Program.cs):

using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;

namespace WcfPoC
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Service1Client proxy = new Service1Client();
                string test = proxy.GetData(5);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Console.WriteLine(e.InnerException.Message);
                Console.WriteLine(e.StackTrace);
            }
        }
    }
}

Выдержка из прокси клиента (Service1.cs):

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public partial class Service1Client : Microsoft.Tools.ServiceModel.CFClientBase<IService1>, IService1
{
    //modified according to the walk thru linked above...
    public static System.ServiceModel.EndpointAddress EndpointAddress = new System.ServiceModel.EndpointAddress("http://boston7/Service1.svc/basic");

    /*
     *a bunch of code create by the svc util - left unmodified
     */
}

Служба (Service1.svc.cs):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace WcfService1
{
    // NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in Web.config and in the associated .svc file.
    public class Service1 : IService1
    {
        public string GetData(int value)  //i'm calling this one...
        {
            return string.Format("You entered: {0}", value);
        }

        public CompositeType GetDataUsingDataContract(CompositeType composite)
        {
            if (composite.BoolValue)
            {
                composite.StringValue += "Suffix";
            }
            return composite;
        }
    }
}

Сервисный интерфейс (IService1.cs):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace WcfService1
{
// NOTE: If you change the interface name "IService1" here, you must also update the reference to "IService1" in Web.config.
[ServiceContract]
public interface IService1
{

    [OperationContract]
    string GetData(int value);  //this is the call im using...

    [OperationContract]
    CompositeType GetDataUsingDataContract(CompositeType composite);

    // TODO: Add your service operations here
}


// Use a data contract as illustrated in the sample below to add composite types to service operations.
[DataContract]
public class CompositeType
{
    /*
     * ommitted - not using this type anyway...
     */
}

}

Выдержка из Web.config:

    <services>
      <service name="WcfService1.Service1" behaviorConfiguration="WcfService1.Service1Behavior">
        <!-- Service Endpoints -->
        <endpoint address="" binding="basicHttpBinding" contract="WcfService1.IService1"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress="http://boston7/" />
            </baseAddresses>
          </host>
      </service>
    </services>

1 Ответ

1 голос
/ 29 апреля 2010

Я думаю, что ваша проблема в том, что в конечных точках IIS адреса всегда считаются относительно адреса файла .svc, который представляет службу.

Вы использовали пустой адрес в конечной точке basicHttp, поэтому это разрешит только путь к файлу .svc.

Я бы предложил две вещи. Поскольку вы размещаете на IIS, добавьте «basic» в качестве адреса для basicHttpBinding и удалите базовый адрес хоста, это избыточно.

Для MSDN: вы всегда должны использовать относительные адреса конечных точек для конечных точек служб IIS. Предоставление полного адреса конечной точки (например, http://localhost/MyService.svc) может привести к ошибкам при развертывании службы, если адрес конечной точки не указывает на приложение IIS, в котором размещается служба, предоставляющее доступ к конечной точке. адреса для размещенных служб избегают этих потенциальных конфликтов

...