Предупреждение о настройке службы WCF (не через Интернет) - PullRequest
2 голосов
/ 26 марта 2019

Visual Studio выдает мне 2 предупреждения:

Severity    Code    Description Project File    Line    Suppression State
Warning     WCF configuration validation warning: The 'name' attribute is invalid - The value 'MyServiceLibrary.MyService' is invalid according to its datatype 'serviceNameType'.  MyServiceLibrary    C:\MyDrive\Flavor\Net\1.0\App\MyServiceLibrary\App.config   10  
Warning     WCF configuration validation warning: The 'contract' attribute is invalid - The value 'MyServiceLibrary.IMyService' is invalid according to its datatype 'serviceContractType'. MyServiceLibrary    C:\MyDrive\Flavor\Net\1.0\App\MyServiceLibrary\App.config   11  

Вот часть файла app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <!-- When deploying the service library project, the content of the config file must be added to the host's 
  app.config file. System.Configuration does not support config files for libraries. -->
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/>
    </startup>
    <system.serviceModel>
        <services>
            <service behaviorConfiguration="MyServiceBehavior" name="MyIpc.IpcAppToService">
                <endpoint address="http://localhost:8733/MyIpcAppToService" binding="basicHttpBinding" bindingConfiguration="MyAppToIPCEndpointBinding" name="MyIpc_IIpcAppToService" contract="MyIpc.IIpcAppToService"/>
                <endpoint address="mex" binding="mexHttpBinding" name="mex" contract="IMetadataExchange"/>
                <host>
                    <baseAddresses>
                        <add baseAddress="http://localhost:8733/MyService/"/>
                    </baseAddresses>
                </host>
            </service>
        </services>
        ...
    </system.serviceModel>
</configuration>

Вот файл сервиса:

namespace MyServiceLibrary
{
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    public class MyService : IMyService
    {
        ...
    }
}

Вот файл интерфейса:

using System.ServiceModel;
using System.ServiceModel.Web;

namespace MyServiceLibrary
{
    [ServiceContract]
    public interface IMyService
    {
        [WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, UriTemplate = "/GetVersionInfo")]
        [OperationContract]
        string GetVersionInfo();
    }
}

Вот мое понимание (app.config):

<service behaviorConfiguration="namespace" name="<namespace>.<service name>">

<endpoint address="..." ... contract="<namespace>.<interface name>"/>

В моем случае имя службы не находится в подкаталоге, поэтому:

namespace=MyServiceLibrary
service name=MyService    (file is MyService.cs)
interface=IMyService      (file is IMyService.cs)

То есть:

<service ... name="MyServiceLibrary.MyService">

и

 <endpoint ... contract="MyServiceLibrary.IMyService"/>

Я уже знаю как факт, что contract - это namespace.interface.

Если бы я поместил служебные и интерфейсные файлы в подкаталог «Связь», чего я не сделал, но скажите, что сделал, тогда

<service ... name="MyServiceLibrary.Communication.MyService">
<endpoint ... contract="MyServiceLibrary.Communication.IMyService"/>

Где MyServiceLibrary.Communication - пространство имен.

досадно, я все еще получаю предупреждения:

 Severity   Code    Description Project File    Line    Suppression State
 Warning        WCF configuration validation warning: The 'name' attribute is invalid - The value 'MyServiceLibrary.MyService' is invalid according to its datatype 'serviceNameType'.  MyServiceLibrary    C:\MyDrive\Flavor\Net\1.0\App\MyServiceLibrary\App.config   10  
 Warning        WCF configuration validation warning: The 'contract' attribute is invalid - The value 'MyServiceLibrary.IMyService' is invalid according to its datatype 'serviceContractType'. MyServiceLibrary    C:\MyDrive\Flavor\Net\1.0\App\MyServiceLibrary\App.config   11  

Есть несколько тем SO, обычно о веб-сервисах, но эта является репрезентативной и говорит о том, что я только что сделал.

Чего мне не хватает?

1 Ответ

2 голосов
/ 26 марта 2019

Самое важное то, что, поскольку вы сказали, что это не-веб конфигурация, это означает, что вы самостоятельно размещены ... то есть есть небольшая шайба .exe проект, который запускается (служба Windows или автоматически активируется или что-то). Это app.config проекта .exe, который нуждается во всей этой информации о конфигурации.

Причина, по которой я предлагаю это, состоит в том, что в ней постоянно говорится MyServiceLibrary.MyService и MyServiceLibrary.IMyService, означающие, что изменения, которые вы вносите, не отражаются при запуске вашего приложения ... то есть (вероятно) вы редактируете приложение. Конфиг в проекте библиотеки (.dll). Это не работает.

(Обратите внимание на предупреждение в комментарии:

<! - При развертывании проекта библиотеки сервисов содержимое файла конфигурации должно быть добавлено к хосту файл app.config. System.Configuration не поддерживает файлы конфигурации для библиотек. ->

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

Как только вы отредактируете правильный .config , вы начнете получать более качественные предупреждения, и в целом вы окажетесь на правильном пути.

Итак, если у вас есть какой-то проект .exe, который запускает службу, он должен создать экземпляр вашей службы.

svc = new ServiceHost( typeof( ServiceNamespace.ServiceClass ) );
svc.Open();

... где svc - постоянный объект некоторого вида (в зависимости от хоста). Если это служба Windows, ваша служба WCF отправляет данные экземпляра вашего переопределенного класса ServiceBase ... и вышеприведенный код входит в метод OnStart. Если это консольное приложение, вы создаете метод Main, который создает объект, а затем просто зацикливается (служба open wcf не прослушивает поток запуска).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...