C # WCF: наличие единого файла app.config в общей библиотеке, предоставляющей доступ к службе - PullRequest
5 голосов
/ 14 апреля 2009

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

public static class WSGateway
{
    public static DBInteractionGatewayClient MR_WebService
    {
        get
        {
            return new DBInteractionGatewayClient();
        } 
    }
}

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

Но проблема в том, что когда проект пытается получить доступ к этому свойству, возникает исключение, сообщающее мне, что мне нужно app.config в приложении, и когда я копирую app.config библиотеку моего шлюза в приложение, это работает.


Есть ли способ избежать наличия нескольких файлов app.config в приложении и иметь только один файл в одной библиотеке?


[Обновление] Решение:

Следуя Anderson Imes 'предложениям, сейчас я решил жестко закодировать эталонную конфигурацию клиента в классе и, таким образом, избавил от необходимости нескольких app.config s.

Таким образом, я перевел свою конфигурацию из этого (app.config):

<configuration>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_IDBInteractionGateway" 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="6000000"
                    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                    allowCookies="false">
                    <security mode="None"/>
                    <readerQuotas maxDepth="6000000" maxStringContentLength="6000000" maxArrayLength="6000000"
                        maxBytesPerRead="6000000" maxNameTableCharCount="6000000" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="false" />
                </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://agnt666laptop:28666/DBInteractionGateway.svc"
                binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IDBInteractionGateway"
                contract="DBInteraction_Service.IDBInteractionGateway" name="WSHttpBinding_IDBInteractionGateway">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration> 

К этому (а static class):

public static class WSGateway
{
    private static WSHttpBinding binding;
    private static EndpointAddress endpointAddress;

    static WSGateway()
    {
        var readerQuotas = new XmlDictionaryReaderQuotas()
        {
            MaxDepth = 6000000,
            MaxStringContentLength = 6000000,
            MaxArrayLength = 6000000,
            MaxBytesPerRead = 6000000,
            MaxNameTableCharCount = 6000000
        };
        binding = new WSHttpBinding(SecurityMode.None) {MaxReceivedMessageSize = 6000000, ReaderQuotas = readerQuotas};

        endpointAddress = new EndpointAddress("http://agnt666laptop:28666/DBInteractionGateway.svc"); 
    }
    public static DBInteractionGatewayClient MR_WebService
    {
        get
        { 
            return new DBInteractionGatewayClient(binding, endpointAddress);
        }
    }
    public static void ExecuteCommand(Action<DBInteractionGatewayClient> command)
    {
        var ws = MR_WebService;
        command.Invoke(ws);
        ws.Close();
    }
}

Ответы [ 2 ]

3 голосов
/ 14 апреля 2009

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

У вас есть несколько вариантов, каждый из которых имеет свою модель развертывания.

  1. Жесткий код информации о конечной точке в вашей библиотеке "Gateway" (общий термин для этого - "прокси"). Вы бы просто вернули новый DBInteractionGatewayClient (привязка, адрес); Для этого решения вы должны распространять только сборку, в которой находился код WSGateway (далее называемый «Сборка WSGateway».
  2. Создайте общий файл конфигурации, к которому имеют доступ все сайты. Если это все службы на одном компьютере, это легко сделать. Поместите данные конфигурации в общий общий диск и прочитайте их оттуда. Если вы хотите, чтобы была доступна вся гамма возможной конфигурации WCF, вам нужно использовать метод ConfigurationManager.OpenMappedExeConfiguration, прочитать его вручную и применить его к привязке перед открытием клиентского канала. Для этого вы должны убедиться, что ваш конфигурационный файл расположен в центре, и распространять сборку WSGateway.
  3. Переместите вашу конфигурацию на общий ресурс, доступный из всех приложений, например, базу данных. Это позволит вам получить доступ к данным конфигурации из любой точки вашего решения. Для этого решения вы должны обеспечить доступ к вашей базе данных конфигурации из всех точек вашего решения и распространять свою сборку WSGateway.

Это решения, которые я мог бы придумать с моей головы. Дайте нам знать, что вы решили сделать.

0 голосов
/ 04 октября 2011

Ответ Андреаса заканчивается буквой «р», поэтому я думаю, что что-то не было скопировано и вставлено правильно. Но это поставило меня на правильный путь, и я придумал это. Я начал с примера введения WCF от MS (Калькулятор).

Это старый метод, который использует app.config в клиентском приложении

        CalculatorClient client = new CalculatorClient(); 

Это жестко закодированная версия, для которой не требуется app.config. Я дважды проверил, что все значения в app.config в разделе привязки являются значениями по умолчанию и не требуют явного копирования. Однако вы можете добавить все эти значения непосредственно в свойства binding.

.
        string address = "http://localhost:8000/ServiceModelSamples/Service/CalculatorService";
        WSHttpBinding binding = new WSHttpBinding();
        binding.Name = "WSHttpBinding_ICalculator"; // not sure if this is necessary.
        EndpointAddress endpointAddress = new EndpointAddress(address);
        CalculatorClient client = new CalculatorClient(binding, endpointAddress);
        return client;

Кстати, я понятия не имею, что я делаю со всеми этими привязками, я просто пытаюсь заставить его работать! Я только что узнал о WCF вчера ... Я хотел поместить весь интерфейс в DLL и не хотел копировать или объединять app.config с интерфейсом GUI.

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