Не удается получить доступ к приложению WCF службы Windows 7, размещенному не в домене - PullRequest
3 голосов
/ 27 марта 2012

Попытка запустить автономное приложение в моей системе Win 7, но без особого успеха.Приложение запускается, но я не могу получить к нему доступ из WCF Test Client или путем добавления ссылки в VS.Я прочитал примерно 1000 сообщений о похожих проблемах, но ни одно из решений не подходит.

Я сделал это:

netsh http add urlacl url=http://+:9090/hello user=LocalPC\UserName

А потом это:

netsh http add iplisten ipaddress=0.0.0.0:9090

Вот код для

void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
        Uri baseAddress = new Uri("http://localhost:9090/hello");

        // Create the ServiceHost.
        using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
        {
            // Enable metadata publishing.
            ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
            smb.HttpGetEnabled = true;
            smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
            host.Description.Behaviors.Add(smb);

            // Add MEX endpoint
            host.AddServiceEndpoint(
              ServiceMetadataBehavior.MexContractName,
              MetadataExchangeBindings.CreateMexHttpBinding(),
              "mex");

            // Add application endpoint
            host.AddServiceEndpoint(typeof(IHelloWorldService), new WSHttpBinding(), "");                

            // Open the ServiceHost to start listening for messages. Since
            // no endpoints are explicitly configured, the runtime will create
            // one endpoint per base address for each service contract implemented
            // by the service.
            try
            {
                host.Open();
            }
            catch (Exception excep)
            {
                string s = excep.Message;
            }
        }
    }

Когда я пытаюсь получить доступ из WCF Test Client, я получаю:

Ошибка: невозможно получить метаданные из http://localhost:9090/hello Если это служба Windows (R) Communication Foundation, к которой у вас есть доступ, убедитесь, что вы включили публикацию метаданных по указанному адресу.Для получения справки о включении публикации метаданных см. Документацию MSDN по адресу http://go.microsoft.com/fwlink/?LinkId=65455.
URI ошибки обмена метаданными WS: http://localhost:9090/hello
Метаданные содержат ссылку, которая не может быть разрешена: 'http://localhost:9090/hello'.
Не было прослушивания конечной точкив http://localhost:9090/hello, который может принять сообщение.Это часто вызвано неправильным адресом или действием SOAP.См. InnerException, если имеется, для получения дополнительной информации.
Невозможно подключиться к удаленному серверу. Невозможно установить соединение, поскольку целевая машина активно отказала ему в этом. 127.0.0.1:9090
HTTP URI ошибки GET: http://localhost:9090/hello Произошла ошибка при загрузке 'http://localhost:9090/hello'. Невозможно подключиться к удаленному серверу. Невозможно установить соединение, поскольку целевая машина активно отказывала в этом 127.0.0.1:9090

Когда я пытаюсь добавить службуссылка, которую я получаю:

Произошла ошибка при загрузке 'http://localhost:9090/hello'.
Невозможно подключиться к удаленному серверу
Невозможно установить соединение, поскольку целевая машина активно отказала ему
127.0.0.1: 9090
Метаданные содержат ссылку, которая не может быть разрешена: 'http://localhost:9090/hello'.
Не было прослушивания конечной точки на http://localhost:9090/hello, которая могла бы принять сообщение
.Это часто вызвано неправильным адресом или действием SOAP.См. InnerException, если имеется, для получения дополнительной информации.
Невозможно подключиться к удаленному серверу
Невозможно установить соединение, поскольку целевая машина активно отказала ему в этом 127.0.0.1:9090
Если служба определена втекущее решение, попробуйте создать решение и снова добавить ссылку на сервис.

1 Ответ

2 голосов
/ 27 марта 2012

Проблема в том, что вы позволяете ServiceHost немедленно выйти из области видимости.

Оператор using удобен для очистки, когда этот блок кода выходит из области видимости, но у вас нет ничего, чтобы это предотвратить. Итак, по сути вы открываете соединение, но затем оно удаляется почти мгновенно ... что закрывает соединение.

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

public partial class WcfHost : Form
{
    private ServiceHost _svcHost;
    private Uri _svcAddress = new Uri("http://localhost:9001/hello");

    public WcfHost()
    {
        _svcHost = new ServiceHost(typeof(HelloWorldService), _svcAddress);

        ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
        smb.HttpGetEnabled = true;
        smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
        _svcHost.Description.Behaviors.Add(smb);

        InitializeComponent();

        FormClosing += WcfHost_FormClosing;
    }

    private void WcfHost_Load(object sender, EventArgs e)
    {
        try
        {
            _svcHost.Open(TimeSpan.FromSeconds(10));
            lblStatus.Text = _svcHost.State.ToString();
        }
        catch(Exception ex)
        {
            lblStatus.Text = ex.Message;
        }            
    }

    void WcfHost_FormClosing(object sender, FormClosingEventArgs e)
    {
        _svcHost.Close();

        lblStatus.Text = _svcHost.State.ToString();
    }
}

[ServiceContract]
public interface IHelloWorldService
{
    [OperationContract]
    string SayHello(string name);
}

public class HelloWorldService : IHelloWorldService
{
    public string SayHello(string name)
    {
        return string.Format("Hello, {0}", name);
    }
}
...