2011-10-26 20 views
5

पर सर्वर का कार्यान्वयन httpsR के साथ उपयोग की जाने वाली XMLRPC.net लाइब्रेरी के बारे में जानकारी ढूंढना बहुत मुश्किल है।सी # एक्सएमएलआरपीसी.NET क्लाइंट और एचटीटीपीएस

एकमात्र प्रलेखन जहां "https" यूआरएल सेट किया जा सकता है, यहां है: http://xml-rpc.net/faq/xmlrpcnetfaq-2-5-0.html#2.3 लेकिन फिर भी यह स्पष्ट नहीं करता है कि कोई सही तरीके से सेटअप कैसे कर सकता है।

डाउनलोड http://xmlrpcnet.googlecode.com/files/xml-rpc.net.2.5.0.zip मैं इस कोशिश की में उपलब्ध कराई गई नमूनों के आधार पर प्रयोग:

IStateName svr = (IStateName)Activator.GetObject(
typeof(IStateName), "https://localhost:5678/statename.rem"); 

क्या सर्वर कोड की तरह दिखता है:

StateNameServer समाधान के client.cs फ़ाइल में

परिवर्तन

IDictionary props = new Hashtable(); 
    props["name"] = "MyHttpChannel"; 
    props["port"] = 5678; 
    HttpChannel channel = new HttpChannel(
    props, 
    null, 
    new XmlRpcServerFormatterSinkProvider() 
    ); 

    ChannelServices.RegisterChannel(channel, false); 

    RemotingConfiguration.RegisterWellKnownServiceType(
    typeof(StateNameServer), 
    "statename.rem", 
    WellKnownObjectMode.Singleton); 

ग्राहक ओबीवी एचटीटीपीएस का उपयोग कर सर्वर से संपर्क करने का प्रयास करते समय अपवाद छोड़ देता है क्योंकि मुझे नहीं पता कि इसे कैसे कॉन्फ़िगर किया जाए। क्या कोई वैसे भी मदद कर सकता है? मुझे किस तरह की चीजों की तलाश करनी चाहिए?

बहुत बहुत धन्यवाद!

उत्तर

3

पहले उदाहरण में बताया गया के लिए एक प्रमाण पत्र को कॉन्फ़िगर करने की आवश्यकता होगी, मैं इस समस्या पर उसकी मदद के लिए और XMLRPC के विकास के लिए दिल से चार्ल्स कुक का शुक्रिया अदा करना चाहते हैं। नेट।

दूसरा, इस नमूने XMLRPC.NET StateNameServer नमूने पर डाउनलोड के लिए उपलब्ध आधारित है: http://xml-rpc.net/download.html

तो यहाँ

समाधान है:

1. उत्पन्न या एक [स्व-हस्ताक्षरित] मिल प्रमाण पत्र (उदाहरण के लिए makecert.exe का उपयोग कर)

2. अपने सर्वर विन्यास के लिए इस प्रमाणपत्र जोड़ें और बंदरगाह आप (इस मामले 5678 में) अपने XMLRPC.NET सर्वर के साथ उपयोग करना चाहते हैं का उपयोग कर httpcf निर्दिष्ट

using System; 
using System.Collections; 
using System.Runtime.Remoting; 
using System.Runtime.Remoting.Channels; 
using System.Runtime.Remoting.Channels.Http; 

using CookComputing.XmlRpc; 

using System.Net; 
using System.IO; 

public class _ 
{ 
    static void Main(string[] args) 
    { 
     HttpListener listener = new HttpListener(); 
     listener.Prefixes.Add("https://127.0.0.1:5678/"); 
     listener.Start(); 
     while (true) 
     { 
      HttpListenerContext context = listener.GetContext(); 
      ListenerService svc = new StateNameService(); 
      svc.ProcessRequest(context); 
     } 

     Console.WriteLine("Press <ENTER> to shutdown"); 
     Console.ReadLine(); 
    } 
} 

public class StateNameService : ListenerService 
{ 
    [XmlRpcMethod("examples.getStateName")] 
    public string GetStateName(int stateNumber) 
    { 
     if (stateNumber < 1 || stateNumber > m_stateNames.Length) 
      throw new XmlRpcFaultException(1, "Invalid state number"); 
     return m_stateNames[stateNumber - 1]; 
    } 

    string[] m_stateNames 
     = { "Alabama", "Alaska", "Arizona", "Arkansas", 
     "California", "Colorado", "Connecticut", "Delaware", "Florida", 
     "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", 
     "Kansas", "Kentucky", "Lousiana", "Maine", "Maryland", "Massachusetts", 
     "Michigan", "Minnesota", "Mississipi", "Missouri", "Montana", 
     "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico", 
     "New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma", 
     "Oregon", "Pennsylviania", "Rhose Island", "South Carolina", 
     "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", 
     "Washington", "West Virginia", "Wisconsin", "Wyoming" }; 
} 

public abstract class ListenerService : XmlRpcHttpServerProtocol 
{ 
    public virtual void ProcessRequest(HttpListenerContext RequestContext) 
    { 
     try 
     { 
      IHttpRequest req = new ListenerRequest(RequestContext.Request); 
      IHttpResponse resp = new ListenerResponse(RequestContext.Response); 
      HandleHttpRequest(req, resp); 
      RequestContext.Response.OutputStream.Close(); 
     } 
     catch (Exception ex) 
     { 
      // "Internal server error" 
      RequestContext.Response.StatusCode = 500; 
      RequestContext.Response.StatusDescription = ex.Message; 
     } 
    } 
} 

public class ListenerRequest : CookComputing.XmlRpc.IHttpRequest 
{ 
    public ListenerRequest(HttpListenerRequest request) 
    { 
     this.request = request; 
    } 

    public Stream InputStream 
    { 
     get { return request.InputStream; } 
    } 

    public string HttpMethod 
    { 
     get { return request.HttpMethod; } 
    } 

    private HttpListenerRequest request; 
} 

public class ListenerResponse : CookComputing.XmlRpc.IHttpResponse 
{ 
    public ListenerResponse(HttpListenerResponse response) 
    { 
     this.response = response; 
    } 

    string IHttpResponse.ContentType 
    { 
     get { return response.ContentType; } 
     set { response.ContentType = value; } 
    } 

    TextWriter IHttpResponse.Output 
    { 
     get { return new StreamWriter(response.OutputStream); } 
    } 

    Stream IHttpResponse.OutputStream 
    { 
     get { return response.OutputStream; } 
    } 

    int IHttpResponse.StatusCode 
    { 
     get { return response.StatusCode; } 
     set { response.StatusCode = value; } 
    } 

    string IHttpResponse.StatusDescription 
    { 
     get { return response.StatusDescription; } 
     set { response.StatusDescription = value; } 
    } 

    private HttpListenerResponse response; 
} 

public class StateNameServer : MarshalByRefObject, IStateName 
{ 
    public string GetStateName(int stateNumber) 
    { 
    if (stateNumber < 1 || stateNumber > m_stateNames.Length) 
     throw new XmlRpcFaultException(1, "Invalid state number"); 
    return m_stateNames[stateNumber-1]; 
    } 

    public string GetStateNames(StateStructRequest request) 
    { 
    if (request.state1 < 1 || request.state1 > m_stateNames.Length) 
     throw new XmlRpcFaultException(1, "State number 1 invalid"); 
    if (request.state2 < 1 || request.state2 > m_stateNames.Length) 
     throw new XmlRpcFaultException(1, "State number 1 invalid"); 
    if (request.state3 < 1 || request.state3 > m_stateNames.Length) 
     throw new XmlRpcFaultException(1, "State number 1 invalid"); 
    string ret = m_stateNames[request.state1-1] + " " 
     + m_stateNames[request.state2-1] + " " 
     + m_stateNames[request.state3-1]; 
    return ret; 
    } 

    string[] m_stateNames 
    = { "Alabama", "Alaska", "Arizona", "Arkansas", 
     "California", "Colorado", "Connecticut", "Delaware", "Florida", 
     "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", 
     "Kansas", "Kentucky", "Lousiana", "Maine", "Maryland", "Massachusetts", 
     "Michigan", "Minnesota", "Mississipi", "Missouri", "Montana", 
     "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico", 
     "New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma", 
     "Oregon", "Pennsylviania", "Rhose Island", "South Carolina", 
     "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", 
     "Washington", "West Virginia", "Wisconsin", "Wyoming" }; 
} 

4. का उपयोग कर अपने XMLRPC.NET ग्राहक को लागू करें: g.exe या HttpSysConfig की तरह एक और उपकरण (ओपन सोर्स)

3. निम्नलिखित कोड का उपयोग कर अपने XMLRPC.NET सर्वर को लागू करें कोड निम्नलिखित

using System; 
using System.Collections; 
using System.Runtime.Remoting; 
using System.Runtime.Remoting.Channels; 
using System.Runtime.Remoting.Channels.Http; 

using CookComputing.XmlRpc; 
using System.Net; 
using System.Security.Cryptography.X509Certificates; 

class _ 
{ 
    public class TrustAllCertificatePolicy : System.Net.ICertificatePolicy 
    { 
     public TrustAllCertificatePolicy() { } 
     public bool CheckValidationResult(ServicePoint sp, 
      X509Certificate cert, 
      WebRequest req, 
      int problem) 
     { 
      return true; 
     } 
    } 
    static void Main(string[] args) 
    { 
     System.Net.ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy(); 
     IStateName proxy = XmlRpcProxyGen.Create<IStateName>(); 
     XmlRpcClientProtocol cp = (XmlRpcClientProtocol)proxy; 
     cp.Url = "https://127.0.0.1:5678/"; 
     cp.ClientCertificates.Add(new System.Security.Cryptography.X509Certificates.X509Certificate(@"C:\path\to\your\certificate\file\my.cer")); 
     cp.KeepAlive = false; 
     //cp.Expect100Continue = false; 
     //cp.NonStandard = XmlRpcNonStandard.All; 

     string stateName = ((IStateName)cp).GetStateName(13); 
    } 
} 
बेशक

(कोड को भी एक नया X509 क्लाइंट प्रमाणपत्र बनाता है), मैं यहाँ नहीं देते इंटरफेस कार्यान्वयन सर्वरस्टेटनाम के लिए प्रविष्टि लेकिन आप इसे शीर्ष पर डाउनलोड लिंक का उपयोग करके नमूना फ़ाइलों में पाएंगे।

टिप्पणी:

System.Net.ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy(); सर्वर कार्यान्वयन को आपके द्वारा जेनरेट किए गए स्वयं-हस्ताक्षरित प्रमाणपत्र को स्वीकार करने की अनुमति देगा। मुझे लगता है कि प्रमाणन प्राधिकरणों द्वारा जारी प्रमाणपत्रों के साथ यह आवश्यक नहीं है।

यदि आपको कुछ भी मिल सकता है जिसे सुधार किया जा सकता है और गलत है तो इसकी बहुत सराहना की जाएगी।

+0

परीक्षण के बाद, मैं पुष्टि कर सकता हूं कि कार्यान्वयन दो अलग-अलग विंडोज मशीनों पर काम करता है। – virrea

2

XmlRpcProxyGen.Create का उपयोग कर क्लाइंट प्रॉक्सी बनाएं, https url निर्दिष्ट करें (आपका इंटरफ़ेस IXmlRpcProxy से प्राप्त होना चाहिए)। यदि आपको क्लाइंट सर्टिफिकेट की आपूर्ति करने की आवश्यकता है तो प्रॉक्सी में क्लाइंट सर्टिफिकेट्स संपत्ति है जिसका उपयोग सिस्टम.Net.HttpWebRequest क्लास पर संबंधित प्रॉपर्टी के समान ही किया जा सकता है।

मुझे नहीं लगता कि रिमोटिंग HTTPS का समर्थन कर सकता है। आप XML-RPC.NET FAQ में वर्णित के रूप HttpListener का उपयोग कर सकते, लेकिन आप इस blog

+0

धन्यवाद चार्ल्स। मैंने XmlRpcProxyGen का उपयोग करने का प्रयास किया लेकिन क्लाइंट डेटा भेजने का प्रयास करते समय अपवाद छोड़ने पर जारी है। सर्वर को किसी प्रकार का प्रमाण पत्र भी नहीं चाहिए? – virrea

+0

सर्वर को लागू करने पर अनुच्छेद जोड़ा गया। –

+0

आपकी मदद चार्ल्स के लिए धन्यवाद, आपके लिंक ने मुझे समाधान खोजने में मदद की। मैंने सर्वर पर प्रमाण पत्र जोड़ा (वास्तव में मेरा स्थानीय कंप्यूटर) ... मेरी प्रतिक्रिया में नीचे दिया गया शेष समाधान। – virrea

1

ग्रेट आलेख! मुझे बहुत मदद करता है। लेकिन आइटम 1 और 2 ने मुझे एक दिन निकालने के लिए लिया। तो यहां मेरा अनुभव है:

  1. स्व-हस्ताक्षरित प्रमाणपत्र उत्पन्न करने के लिए मैंने openssl उपकरण का उपयोग किया। बस लिंक में निर्देश का पालन करें। यह प्रमाण पत्र मुझे क्लाइंट एप्लिकेशन के लिए जरूरी था।
  2. सर्वर एप्लिकेशन के लिए मुझे एक और प्रमाणपत्र की आवश्यकता है। सर्वर कोड HttpListener क्लास का उपयोग करता है जिसमें कोई प्रमाण पत्र प्रॉपर्टी नहीं है। HttpListener वर्ग के उदाहरण के लिए विशिष्ट प्रमाणपत्र कैसे लागू करें, इसका कोई तरीका नहीं है। एक और रणनीति है:
    • स्थानीय प्रमाणपत्र भंडारण में नया प्रमाणपत्र बनाएं। इस प्रकार 'mmc' cmd-> फ़ाइल-> स्नैप-इन-> प्रमाणपत्र-> जोड़ें-> कंप्यूटर खाता-> स्थानीय कंप्यूटर-> ठीक है। व्यक्तिगत-> प्रमाणपत्र-> राइट क्लिक-> सभी कार्य-> नए प्रमाणपत्र का अनुरोध करें। अगला-> अगला-> वेब सर्वर का चयन करें-> नीले लिंक पर क्लिक करें-> मूल रूप से आपको केवल सामान्य नाम महसूस करना होगा (वांछित प्रमाणपत्र नाम दें)। Ok-> नामांकित करें। अब आपके पास स्थानीय भंडारण में आपका प्रमाण पत्र है।
    • बाइंड विशिष्ट आईपी/पोर्ट जोड़ी में प्रमाण पत्र बनाया। इस दौड़ को cmd में निम्न स्ट्रिंग करने के लिए: netsh http add sslcert ipport=192.168.111.195:4022 certhash=c8973a86141a7a564a6f509d1ecfea326a1852a2 appid={0a582a74-fc2d-476c-9281-c73b2e4bfb26}, जहां 'ipport' आईपी/पोर्ट जोड़ी है जिसका उपयोग एसएसएल कनेक्शन के लिए किया जाएगा; 'certhash' एक प्रमाणपत्र हैश (खुले प्रमाणपत्र जो आपने पिछले चरण में बनाया था-> विवरण पर जाएं-> थंबप्रिंट की तलाश करें); 'एपिड' कोई भी हो सकता है।

आप तो आपके द्वारा निर्दिष्ट 'https' में अपने HttpListener इस वर्ग के लिए स्वचालित रूप से आबद्ध प्रमाण पत्र के लिए दिखेगा URL।

+0

चमक ने मदद की! :) मैं आपके नोट्स का प्रयास करूंगा। – virrea

संबंधित मुद्दे