Создать XML-представление экземпляра привязки WCF - PullRequest
1 голос
/ 15 декабря 2011

Я пытаюсь написать код для преобразования WCF wsHttpBinding в customBinding, используя метод, описанный в методе WSHttpBinding.CreateBindingElements .

Binding wsHttpBinding = ...
BindingElementCollection beCollection = originalBinding.CreateBindingElements();
foreach (var element in beCollection)
{
    customBinding.Elements.Add(element);
}

После создания пользовательской привязкиЯ хочу создать представление XML для этой новой пользовательской привязки.(То же самое представление XML, которое находится в файле приложения .config).

Есть ли способ сделать это?

(Мне известно об инструменте, указанном в этом ответе: https://stackoverflow.com/a/4217892/5688, но мне нужно что-то, что я могу позвонить в приложении и без зависимости от службы в облаке)

Ответы [ 2 ]

5 голосов
/ 17 декабря 2011

Класс, который я искал, был System.ServiceModel.Description.ServiceContractGenerator

Пример создания конфигурации для экземпляра любого вида привязки:

public static string SerializeBindingToXmlString(Binding binding)
{
    var tempConfig = Path.GetTempFileName();
    var tempExe = tempConfig + ".exe";
    var tempExeConfig = tempConfig + ".exe.config";
    // [... create empty .exe and empty .exe.config...]

    var configuration = ConfigurationManager.OpenExeConfiguration(tempExe);
    var contractGenerator = new ServiceContractGenerator(configuration);
    string bindingSectionName;
    string configurationName;
    contractGenerator.GenerateBinding(binding, out bindingSectionName, out configurationName);

    BindingsSection bindingsSection = BindingsSection.GetSection(contractGenerator.Configuration);

    // this needs to be called in order for GetRawXml() to return the updated config
    // (otherwise it will return an empty string)
    contractGenerator.Configuration.Save(); 

    string xmlConfig = bindingsSection.SectionInformation.GetRawXml();

    // [... delete the temporary files ...]
    return xmlConfig;
}

Это решение похоже на хак из-за необходимости генерировать пустые временные файлы, но оно работает.

Теперь мне нужно будет найти способ получить экземпляр System полностью в памяти.Configuration.Configuration (возможно, написав мою собственную реализацию)

0 голосов
/ 10 октября 2018

Добавлены недостающие части кода:

  • // [... создать пустой .exe и пустой .exe.config ...]
  • // [... удалить временные файлы ...]

        public static string SerializeBindingToXmlString(Binding binding)
    {
        var tempConfig = System.IO.Path.GetTempFileName();
        var tempExe = tempConfig + ".exe";
        var tempExeConfig = tempConfig + ".exe.config";
        using(System.IO.FileStream fs = new System.IO.FileStream(tempExe, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite))
        {
    
        }
        using (System.IO.FileStream fs = new System.IO.FileStream(tempExeConfig, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite))
        {
            fs.SetLength(0);
            using (System.IO.StreamWriter sr = new System.IO.StreamWriter(fs, System.Text.Encoding.UTF8)) {
                sr.WriteLine("<?xml version= \"1.0\" encoding=\"utf-8\" ?>");
                sr.WriteLine(@"<configuration />");
            }
        }
    
        var configuration = System.Configuration.ConfigurationManager.OpenExeConfiguration(tempExe);
        var contractGenerator = new System.ServiceModel.Description. ServiceContractGenerator(configuration);
        string bindingSectionName;
        string configurationName;
        contractGenerator.GenerateBinding(binding, out bindingSectionName, out configurationName);
    
       var bindingsSection =System.ServiceModel.Configuration.BindingsSection.GetSection(contractGenerator.Configuration);
    
        // this needs to be called in order for GetRawXml() to return the updated config
        // (otherwise it will return an empty string)
        contractGenerator.Configuration.Save();
    
        string xmlConfig = bindingsSection.SectionInformation.GetRawXml();
        System.IO.File.Delete(tempExeConfig);
        System.IO.File.Delete(tempExe);
        return xmlConfig;
    }
    
...