WCF Newbie: создайте прокси WCF для подключения к старой веб-службе ASMX - PullRequest
1 голос
/ 15 февраля 2011

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

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

Я создал обычную библиотеку классов .NET, которая в основном создает одноэлементный экземпляр для службы ASMX, но я не уверен, как я мог бы представить его в службе WCF.

Было бы возможно, если бы вы могли указать мне, где я могу видеть примеры WCF, выступающего в качестве прокси для использования служб ASMX?

Ниже мой код:

public static class Service<T> where T : WebServicesClientProtocol
{
    static volatile T _Instance;
    static volatile int _NumberOfReference = 0;
    static object syncRoot = new object();

    static Service() { }

    public static T Instance
    {
        get
        {
            if (_Instance == null)
            {
                lock (syncRoot)
                {
                    if (_Instance == null)
                    _Instance = ServiceProxyHelper.CreateServiceProxy<T>(ConfigValueHelper.GetServiceUrl(typeof(T).Name), ConfigValueHelper.CertificateHashKey);
                }
            }
            return _Instance;
        }
    }
}

А вот помощники, которыми я пользуюсь:

public static class ServiceProxyHelper
{
    public static T CreateServiceProxy<T>(string url, string clientBase64KeyId)
    {
        var webService = SetSecurityCredentials(clientBase64KeyId, url, typeof(T));

        if (webService == null)
            return default(T);

        return (T)Convert.ChangeType(webService, typeof(T));
    }

    private static WebServicesClientProtocol SetSecurityCredentials(string clientBase64KeyId, string url, Type serviceType)
    {
        WebServicesClientProtocol result = null;

        result = (WebServicesClientProtocol)Activator.CreateInstance(serviceType, true);
        result.Url = url;

        //Verify default credentials
        if (WebRequest.DefaultWebProxy != null)
        {
            result.Proxy = WebRequest.DefaultWebProxy;
            result.Credentials = CredentialCache.DefaultCredentials;
            result.Proxy.Credentials = CredentialCache.DefaultNetworkCredentials;
        }

        //Add security credentials to SOAP envelope
        var token = ServiceProxyHelper.GetSecurityToken(clientBase64KeyId, url);

        if (token == null)
            return null;

        result.RequestSoapContext.Security.Tokens.Add(token);
        result.RequestSoapContext.Security.Elements.Add(new MessageSignature(token));

        return result;
    }

    private static X509SecurityToken GetSecurityToken(string clientBase64KeyId, string url)
    {
        X509SecurityToken result = null;
        X509Certificate x509Certificate = null;

        var store = X509CertificateStore.CurrentUserStore(X509CertificateStore.MyStore);
        var isOpen = store.OpenRead();

        foreach (X509Certificate certificate in store.Certificates)
        {
            if (Convert.ToBase64String(certificate.GetKeyIdentifier()) != clientBase64KeyId)
                continue;

            x509Certificate = certificate;
            result = new X509SecurityToken(certificate);
            break;
        }

        if (isOpen)
            store.Close();

        return result;
    }
}

1 Ответ

2 голосов
/ 15 февраля 2011

В этом случае я бы создал [ServiceContract] в WCF и добавил бы все методы из ASMX, к которым я хочу, чтобы клиенты обращались.Затем предоставьте этот сервисный контракт, используя конечные точки WCF.Это будет действовать как фасад.Надеюсь, что это имеет смысл для вас.

...