System.ServiceModel.MessageContractAttribute с изменением пространств имен - PullRequest
0 голосов
/ 05 апреля 2019

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

Я могу получить экспортированную ссылку на сервис в виде cs-файла. Классы там выглядят примерно так:

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.MessageContractAttribute(WrapperName="abc_cfg_keyResponse", WrapperNamespace="http://abc/xsd", IsWrapped=true)]
public partial class abc_cfg_keyResponse
{

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://abc/xsd", Order=0)]
    public System.Nullable<int> x_id;
}

Количество серверов зависит от того, как была запущена служба linux. В зависимости от того, кто администрирует этот сервер и как они относятся к верхнему, нижнему регистру и общим именам, URI для пространства имен может быть "http://abc/xsd"," http://ABC/xsd" или на самом деле что-то еще. На сервере запущено несколько служб, что означает, что "http://def/xsd" может принадлежать или не принадлежать одной и той же службе.

MessageBodyMemberAttribute дает статическую информацию о типе времени компиляции. Атрибут Namespace должен быть допустимым URI.

Моя проблема в том, что я могу создать свой сервис только для одного целевого сервера. То, что я хочу построить, должно быть совместимо со многими серверами.

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

Я попытался изменить URI на универсальный URI и позволить серверу определить xsd. В принципе имена классов будут уникальными без пространства имен, что означает, что при динамическом сопоставлении будет гарантировано найти правильное пространство имен. К сожалению, http://*/xsd" не является допустимым URI для этой технологии и создает исключение времени выполнения.

Я был бы очень рад, если бы мог сгенерировать выражение регулярного выражения для сервера, чтобы найти пространство имен. Для моего случая это \w*[aA][bB][cC]\w* далеко уведет меня, но я думаю, что мне не повезет, учитывая, что подстановочный знак uri не поддерживается.

Разрешение точно abc и ABC будет охватывать что-то близкое к 100% случаев использования.

Могу ли я что-нибудь сделать с атрибутами декорации, чтобы позволить пространствам имен с разными именами быть действительными для одного и того же объекта?

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

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