AMcoder - javascript, python, java, html, php, sql

(Multi-Tenant WCF Services) Պարամետրերի պակաս մեթոդներ WCF-ի համար URL երթուղղմամբ

Սա կապված է իմ նախորդ հարցի հետ, բայց այլ հարց է:

Շատ փնտրելուց հետո ես չեմ կարողանում գտնել լավագույն լուծումը WCF-ի խնդրին հետևելու համար:

Կա ընդամենը մեկ SVC ֆայլ, բայց մի քանի URL՝ դրան մուտք գործելու համար, օրինակ. Org1 կազմակերպությունը կունենա URL http://CRMserver_name/Org1/XRMServices/2011/Organization.svc, իսկ Org2-ը՝ http://CRMserver_name/Org2/XRMServices/2011/Organization.svc

Ես փորձում էի սա՝ օգտագործելով URL Routing-ը, բայց խնդիրն այն է, որ այն ստեղծում է REST ծառայություններ, որոնք մենք չենք ուզում: Մենք պետք է կարողանանք մուտք գործել այս ծառայությունները ճիշտ այնպես, ինչպես սովորական WCF ծառայությունը: Այսպիսով, եթե մենք ավելացնենք URL http://CRMserver_name/Org1/XRMServices/2011/Organization.svc-ը WCF թեստային հաճախորդում, այն պետք է աշխատի:

CRM-ն դա անում է, այնպես որ ճանապարհ կա, բայց ես չեմ կարողանում գտնել այն: Օգնիր ինձ։

Շնորհակալություն, Նիլեշ


Պատասխանները:


1

Ես վստահ չեմ, արդյոք սա կլուծի ձեր խնդիրը, բայց նայեք IIS Url Rewrite մոդուլին: Դա կարող է լուծել ձեր խնդիրը:

26.07.2011
  • Ես փորձեցի URL Rewrite-ը, բայց չկարողացա լուծում գտնել՝ URI-ից Վարձակալի անունը մուտք գործելու համար - baseURI\{orgName}\Service1.svc, երբ կանչվում է ծառայության մեթոդները: 05.08.2011

  • 2

    Շատ հետազոտություններից հետո ես գնում եմ դրան հասնելու անվտանգ ճանապարհով: Ես պատրաստվում եմ ստեղծել առանձին WCF նախագծեր յուրաքանչյուր վարձակալի համար և հյուրընկալել դրանք առանձին IIS վիրտուալ դիրեկտորիաներում: օր. Tenant1 - http://localhost/ Tenant1/Service1.svc և Tenant2 - http://localhost/Tenant2/Service1.svc-ի համար Նկատի ունեցեք, որ SVC անունը նույնն է: Այնուհետև ես հեռացնում եմ IService1.cs-ը և Service1.svc.cs-ը Tenant2-ից և ավելացնում եմ գոյություն ունեցող ֆայլը որպես հղում Tenant1-ից: Ես պետք է դա անեմ յուրաքանչյուր նոր վարձակալի համար, և այդ պատճառով սա մաքուր լուծում չէ: Այժմ իմ լուծումների հետազոտողը նման է հետևյալին.

    SoluExp

    Այստեղ WcfService3-ը Tenant1-ի համար է, իսկ WcfService1-ը Tenant2-ի համար (Կներեք այս շփոթեցնող անունների համար: Ես կարող եմ ուղղել այն, եթե ինչ-որ մեկին անհրաժեշտ լինի): Այսպիսով, իմ WcfService3 հատկությունները նման են հետևյալին.

    Project Prop

    Այժմ և՛ http://localhost/ Tenant1/Service1.svc, և՛ http://localhost/ Tenant2/Service1.svc ծառայության կոդը գտնվում է մեկ տեղում, որը գտնվում է WcfServices3->Service1.svc.cs-ում: Հետևյալ կոդը կստեղծի տվյալների բազայի միացման օբյեկտը կոնկրետ մեթոդի կանչի համար:

        private static string dbServerName = "YourDBServerName";    
        private static SqlConnection dbConnection = createDBConnection();            
        private static SqlConnection createDBConnection()
        {
            Uri fullUri = OperationContext.Current.IncomingMessageHeaders.To;
            Uri baseAddress = new Uri(@"http://localhost");
            UriTemplate template = new UriTemplate(@"/{orgName}/Service1.svc");
    
            // retrieve the value of the artist segment
            UriTemplateMatch match = template.Match(baseAddress, fullUri);
            String orgName = match.BoundVariables["orgName"];        
    
            SqlConnection objConnection = new SqlConnection();
            objConnection.ConnectionString = createConnString(orgName);
    
            return objConnection;
        }
    
        private static string createConnString(string orgName)
        {
            return (String.Format("Data Source={0};Initial Catalog={1}_MSCRM;User Id=UserId1;Password=PasswordForUserId1;", dbServerName, orgName));
        }
    

    Ես գիտեմ, որ սա խնդրի իրական լուծում չէ (Multi-Tenant WCF ծառայություններ), այլ արագ, հեշտ և անվտանգ աշխատանք: Հուսով եմ, որ սա օգնում է ինչ-որ մեկին: Նաև, եթե այստեղ որևէ խնդիր եք տեսնում կամ ավելի լավ լուծում գիտեք, խնդրում եմ տեղեկացնել ինձ:

    -Նիլեշ

    05.08.2011

    3

    Ես գտել եմ այն, ինչ իմ կարծիքով ավելի լավ մոտեցում է: Փոխանակ փորձեք վերցնել թիրախ Uri-ն IncomingMessageHeaders օբյեկտից (որը ձեզ տալիս է սերվերի տեսակետը հյուրընկալողի, այլ ոչ թե հաճախորդի), փոխարենը վերցրեք այն HttpRequest վերնագրերից:

    Ահա մի քանի սպասարկման մեթոդներ, որոնք ես ստեղծել եմ, որոնք դա ապացուցում են երկու եղանակով.

    1. GetTenantByRewrittenURL աշխատում է URL Rewrite 2.0 կանոնի հետ համատեղ: Այս կանոնը կգտնի վարձակալի անունը Uri ուղու առաջին մասում (տիրույթից հետո), օրինակ. www.mydomain.com/tenant1/MyService.svc: Այն այնուհետև (ա) վերագրում է URL-ը, հանելով վարձակալի ID-ն և (բ) պահում է վարձակալի ID-ն HTTP_REFERER վերնագրի դաշտում: Ես կարող եմ ձեզ տալ URL Rewrite կանոնը՝ դա անելու համար, եթե վստահ չեք. Մի մոռացեք նաև ավելացնել HTTP_REFERER-ը ընդունված սերվերի փոփոխականների ցանկում՝ URL Rewrite կազմաձևում:

    2. GetTenantByFakeHost աշխատում է հյուրընկալող վերնագրերի հետ համատեղ: Դրա համար ես ավելացրել եմ հյուրընկալող վերնագիր իմ IIS-ի հետ կապված հարցումներ ստանալու համար tenant1.mydomain.com/MyService.svc ձևով:

    Սա, ըստ երևույթին, հասնում է այն ամենին, ինչին ձգտում էիք, և հուսով ենք, որ դուք պետք է կարողանաք մուտք գործել Http վերնագրեր ձեր միջին մակարդակում OperationContext-ի միջոցով, թեև ես դեռ չեմ հաստատել դա:

       public string GetTenantIDByRewrittenURL()
        {
            HttpRequestMessageProperty prop = (HttpRequestMessageProperty) OperationContext.Current.IncomingMessageProperties[HttpRequestMessageProperty.Name];
            string tenantID = prop.Headers[HttpRequestHeader.Referer];
    
            return tenantID;
        }
    
        public string GetTenantIDByFakeHost()
        {
            HttpRequestMessageProperty prop = (HttpRequestMessageProperty)OperationContext.Current.IncomingMessageProperties[HttpRequestMessageProperty.Name];
            string tenantID = prop.Headers[HttpRequestHeader.Host];
    
            return tenantID;
        }
    
    20.12.2012
  • Պետք չէ ստորագրություն ներառել ձեր գրառման մեջ. ձեր օգտատիրոջ քարտն ավտոմատ կերպով ավելացվում է: Լրացուցիչ մանրամասների համար կարդացեք ՀՏՀ: 20.12.2012
  • Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..