Как программно изменить WCF app.config установка адреса конечной точки?

Тип pointer-to-member-function отличается от pointer-to-function.

Тип функции различается в зависимости от того, является ли она обычной или нестатической функцией-членом некоторого класса:

int f(int x);
the type is "int (*)(int)" // since it is an ordinary function

И

int Mat::f2(int x);
the type is "int (Mat::*)(int)" // since it is a non-static member function of class Mat

Примечание: если это статическая функция-член класса Fred, ее тип такой же, как если бы она была обычной функцией: "int (*)(char,float)"

В C ++ функции-члены имеют неявный параметр который указывает на объект (указатель this внутри функции-члена). Нормальные функции C могут рассматриваться как имеющие другое соглашение о вызовах от функций-членов , поэтому типы их указателей (указатель на функцию-член и указатель на функцию) различны и несовместимы. C ++ вводит новый тип указателя, , называемый указатель на член, который может быть вызван только путем предоставления объекта .

ПРИМЕЧАНИЕ: не пытайтесь «привести» функцию указатель к члену в указатель на функцию; результат не определен и, вероятно, катастрофический. Например, указатель на функцию-член не обязан содержать машинный адрес соответствующей функции. Как было сказано в последнем примере, если у вас есть указатель на обычную функцию C, используйте либо функцию верхнего уровня (не член), либо статическую (класс) функцию-член.

Подробнее об этом Здесь и здесь .

49
задан Simon MᶜKenzie 11 April 2013 в 17:44
поделиться

3 ответа

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

Вот пример события пост-сборки, которое я использовал в прошлом, который заменяет выходной файл правильной версией (отладка / время выполнения)

copy "$(ProjectDir)ServiceReferences.ClientConfig.$(ConfigurationName)" "$(ProjectDir)ServiceReferences.ClientConfig" /Y

, где: $ (ProjectDir) - это каталог проекта, в котором расположены файлы конфигурации $ (ConfigurationName) - активный тип сборки конфигурации

РЕДАКТИРОВАТЬ: См. Ответ Марка для подробного объяснения того, как это сделать программно.

1
ответ дан 7 November 2019 в 11:22
поделиться

Это на стороне клиента ??

Если да, вам нужно создать экземпляр WsHttpBinding и EndpointAddress, а затем передать эти два конструктору прокси-клиента, который принимает эти два параметра в качестве параметров.

// using System.ServiceModel;
WSHttpBinding binding = new WSHttpBinding();
EndpointAddress endpoint = new EndpointAddress(new Uri("http://localhost:9000/MyService"));

MyServiceClient client = new MyServiceClient(binding, endpoint);

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

ServiceHost svcHost = new ServiceHost(typeof(MyService), null);

svcHost.AddServiceEndpoint(typeof(IMyService), 
                           new WSHttpBinding(), 
                           "http://localhost:9000/MyService");

Конечно, у вас может быть несколько из эти конечные точки службы добавлены к вашему узлу службы. Когда вы закончите, вам нужно открыть хост службы, вызвав метод .Open ().

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

Например, вы можете легко получить:

<endpoint address="http://mydomain/MyService.svc"
        binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IASRService"
        contract="ASRService.IASRService" 
        name="WSHttpBinding_IASRService">
        <identity>
            <dns value="localhost" />
        </identity>
</endpoint>

<endpoint address="https://mydomain/MyService2.svc"
        binding="wsHttpBinding" bindingConfiguration="SecureHttpBinding_IASRService"
        contract="ASRService.IASRService" 
        name="SecureWSHttpBinding_IASRService">
        <identity>
            <dns value="localhost" />
        </identity>
</endpoint>

<endpoint address="net.tcp://mydomain/MyService3.svc"
        binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IASRService"
        contract="ASRService.IASRService" 
        name="NetTcpBinding_IASRService">
        <identity>
            <dns value="localhost" />
        </identity>
</endpoint>

(три разных имени, разные параметры, указав разные параметры привязки), а затем просто выберите правильный вариант для создания экземпляра вашего сервера ( или клиентский прокси).

Но в обоих случаях - сервер и клиент - вы должны выбрать перед фактическим созданием хоста службы или прокси-клиента. После создания они неизменяемы - вы не можете изменять их, когда они будут запущены и работают.

Marc

Но в обоих случаях - сервер и клиент - вы должны выбрать перед фактическим созданием хоста службы или прокси-клиента. После создания они неизменяемы - вы не можете изменять их, когда они будут запущены и работают.

Marc

Но в обоих случаях - сервер и клиент - вы должны выбрать перед фактическим созданием хоста службы или прокси-клиента. После создания они неизменяемы - вы не можете изменять их, когда они будут запущены и работают.

Marc

95
ответ дан 7 November 2019 в 11:22
поделиться
require 'mechanize'

class Foo

  def some_method
    begin
      do_some_stuff
    rescue WWW::Mechanize::ResponseCodeError => e
      if e.response_code.to_i == 503
        handle_the_situation
      end
    end
  end

end

describe "Foo" do

  it "should handle a 503 response" do
    page = stub(:code=>503)
    foo = Foo.new
    foo.should_receive(:do_some_stuff).with(no_args)\
    .and_raise(WWW::Mechanize::ResponseCodeError.new(page))
    foo.should_receive(:handle_the_situation).with(no_args)
    foo.some_method
  end

end
-121--3498681-

Я оставляю цитату из презентации, которую Дуглас Крокфорд (создатель стандарта JSON) дал Yahoo.

Он рассказывает о том, как он открыл JSON, и, среди прочего, почему он решил использовать процитированные ключи :

... Это было, когда мы обнаружили проблема с именем без кавычек. Получается Сценарий ECMA 3 зарезервирован политика слов. Зарезервированные слова должны быть в ключевой позиции, которая действительно неприятность. Когда я обошел чтобы сформулировать это в стандарт, я не хотел, чтобы пришлось положить все зарезервированные слова в стандарте, потому что это выглядело бы очень глупо.

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

Вот почему по сей день ключи приводятся в JSON.

Полный текст видео и стенограммы можно найти здесь .

-121--785955-

Для изменения адреса конечной точки в файле App.Config. Перед использованием можно изменить или удалить пространство имен.

using System;
using System.Xml;
using System.Configuration;
using System.Reflection;
//...

namespace Glenlough.Generations.SupervisorII
{
    public class ConfigSettings
    {

        private static string NodePath = "//system.serviceModel//client//endpoint";
        private ConfigSettings() { }

        public static string GetEndpointAddress()
        {
            return ConfigSettings.loadConfigDocument().SelectSingleNode(NodePath).Attributes["address"].Value;
        }

        public static void SaveEndpointAddress(string endpointAddress)
        {
            // load config document for current assembly
            XmlDocument doc = loadConfigDocument();

            // retrieve appSettings node
            XmlNode node = doc.SelectSingleNode(NodePath);

            if (node == null)
                throw new InvalidOperationException("Error. Could not find endpoint node in config file.");

            try
            {
                // select the 'add' element that contains the key
                //XmlElement elem = (XmlElement)node.SelectSingleNode(string.Format("//add[@key='{0}']", key));
                node.Attributes["address"].Value = endpointAddress;

                doc.Save(getConfigFilePath());
            }
            catch( Exception e )
            {
                throw e;
            }
        }

        public static XmlDocument loadConfigDocument()
        {
            XmlDocument doc = null;
            try
            {
                doc = new XmlDocument();
                doc.Load(getConfigFilePath());
                return doc;
            }
            catch (System.IO.FileNotFoundException e)
            {
                throw new Exception("No configuration file found.", e);
            }
        }

        private static string getConfigFilePath()
        {
            return Assembly.GetExecutingAssembly().Location + ".config";
        }
    }
}
26
ответ дан 7 November 2019 в 11:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: