Можно ли создать динамическую ссылку клиента веб-службы, не добавляя ее ссылку на ссылки службы проекта? - PullRequest
0 голосов
/ 04 июля 2011

Мне нужно создать динамические ссылки на несколько веб-сервисов и отправить с ними некоторое значение.

Ответы [ 2 ]

2 голосов
/ 05 июля 2011

Чтобы быть по-настоящему динамичным, вы должны сделать три вещи:

1) Получить описание услуги (wsdl) из веб-службы. 2) Генерация прокси-кода динамически из описания сервиса 3) Скомпилируйте код и представьте его в своем приложении - обычно с помощью рефлексии или какого-то динамического интерфейса сценариев.

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

Не включает шаг (3). Сгенерированный код может быть скомпилирован с классами, предоставленными в пространстве имен System.CodeDom.Compiler.

Uri uri = new Uri(_Url + "?wsdl");
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.AllowAutoRedirect = true;
request.PreAuthenticate = false;
if (_User.Length > 0)
{
    request.UseDefaultCredentials = false;
    request.Credentials = new NetworkCredential(_User, _Password, _Domain);
}
WebResponse response = null;

try
{
    response = request.GetResponse();
}
catch (System.Net.WebException wex)
{
    response = wex.Response;
}
catch (Exception ex)
{
}

Stream requestStream = response.GetResponseStream();
ServiceDescription sd = ServiceDescription.Read(requestStream);
_ReferenceName = _Namespace + "." + sd.Services[0].Name;
ServiceDescriptionImporter Importer = new ServiceDescriptionImporter();
Importer.AddServiceDescription(sd, string.Empty, string.Empty);
Importer.ProtocolName = "Soap12";
Importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties;

CodeNamespace nameSpace = new CodeNamespace(_Namespace);
CodeCompileUnit ccu = new CodeCompileUnit();
ccu.Namespaces.Add(nameSpace);

ServiceDescriptionImportWarnings warnings = Importer.Import(nameSpace, ccu);
if (warnings == 0)
{
    StringWriter sw = new StringWriter(System.Globalization.CultureInfo.CurrentCulture);
    Microsoft.CSharp.CSharpCodeProvider prov = new Microsoft.CSharp.CSharpCodeProvider();
    CodeGeneratorOptions options = new CodeGeneratorOptions();
    options.BlankLinesBetweenMembers = false;
    options.BracingStyle = "C";

    prov.GenerateCodeFromNamespace(nameSpace, sw, options);

    _ProxySource = sw.ToString();
    sw.Close();
}
0 голосов
/ 04 июля 2011

У меня сейчас нет кода, но я знаю, что это можно сделать, фактически в предыдущей компании, в которой я работал, у нас был собственный клиент веб-службы, разработанный в доме.здесь:

Общий прокси веб-службы

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