2011-12-02 13 views
8

सारांश में
आईज़ में आईआईएस में होस्ट किए जाने पर मैं स्थानीयहोस्ट पर डब्ल्यूसीएफ सेवा कैसे प्राप्त करूं? Azure मेरी वेबसाइट पर localhost या 127.0.0.1 बांध नहीं है।Azure पर स्थानीयहोस्ट पर डब्ल्यूसीएफ का उपयोग

विवरण
मैं एक ASP.Net आवेदन Azure पर होस्ट की है। मैंने एक एसएससी और कुछ वर्कफ़्लो जोड़े हैं जिन्हें मैं डब्ल्यूसीएफ के माध्यम से उपयोग करना चाहता हूं। मामलों को सरल रखने के लिए, मेरा वेब ऐप बस लोकहोस्ट पर सेवा को कॉल करता है, इसलिए मेरे पास web.config में इनके अंत बिंदु हैं;

<client> 
    <endpoint address="http://localhost:8080/Router.svc/Case" binding="basicHttpBinding" contract="NewOrbit.ExVerifier.Model.Workflow.Case.ICaseWorkflow" name="Case" /> 
    <endpoint address="http://localhost:8080/Workflow/Case/Case_default1.xamlx" binding="basicHttpBinding" contract="*" name="Case_default1" /> 
</client> 

यह मेरी स्थानीय मशीन पर ठीक काम करता है। समस्या यह है कि जब मैं इसे Azure में प्रकाशित करता हूं, आईआईएस में वेबसाइट को स्थानीयहोस्ट के लिए बाध्यकारी नहीं मिलता है, इसके बजाय बाइंडिंग हमेशा सर्वर के वास्तविक आईपी पते पर होती है। यह applicationHost.config में इस तरह लग रही समाप्त होता है:

<bindings> 
    <binding protocol="http" bindingInformation="10.61.90.44:80:" /> 
    <binding protocol="https" bindingInformation="10.61.90.44:443:" /> 
    <binding protocol="http" bindingInformation="10.61.90.44:8081:" /> 
</bindings> 

तो, जैसे ही अपने वेब एप्लिकेशन (उस बात के लिए या 127.0.0.1) स्थानीय होस्ट पर सेवा को कॉल करने में विफल रहता है तो वह तुरंत कोशिश करता है। कहने की जरूरत नहीं है, अगर मैं सर्वर पर rdp और बाध्यकारी बदल तो सब ठीक है।

मुझे वास्तव में अजीब लगता है कि वहां कई उदाहरण हैं जहां लोग एज़ूर पर लोकहोस्ट पर डब्ल्यूसीएफ सेवाओं तक पहुंच रहे हैं, इसलिए मुझे पता नहीं चल रहा है कि ऐसा क्यों है। मैंने osFamily को 2 पर सेट किया है और इसे डीबग करने के लिए मैंने वेब प्रकाशन और रिमोट डेस्कटॉप एक्सेस सक्षम किया है, जो मुझे लगता है, सिद्धांत रूप में, गड़बड़ कर सकता है।

क्या मैं पहले से ही

  • पर ध्यान दिया है मैं अंत बिंदु का पता मेरी कोड में कार्यावधि में वास्तविक पते के लिए स्थानीय होस्ट स्थानापन्न या गतिशील के रूप में जवाब में रॉन द्वारा वर्णित समाप्ति बिंदु बनाने के लिए पुनर्लेखन कर सकते हैं । दुर्भाग्य से मैं डब्ल्यूसीएफ रूटिंग सेवा का उपयोग कर रहा हूं ताकि मैं संस्करण वर्कफ़्लो कर सकूं। इसका मतलब है कि मेरा कोड राउटर एंडपॉइंट कहता है और डब्ल्यूसीएफ राउटर में बदले में वेब.कॉन्फिग में निर्दिष्ट एंडपॉइंट का उपयोग करके वास्तविक सेवा/वर्कफ़्लो को कॉल किया जाता है। मुझे रूटिंग सेवाओं एंडपॉइंट रिज़ॉल्यूशन पर नियंत्रण नहीं है, मुझे लगता है कि रूटिंग लॉजिक का एक पूरा सेट लिखना जो कि बहुत सारे काम लगता है, जब मैं चाहता हूं कि स्थानीयहोस्ट को कॉल करना है :)
  • नाम का उपयोग करने के लिए स्विचिंग पाइप; हां, यह वर्कफ़्लोज़ के साथ कुछ अजीब मुद्दों का कारण बनता है, शायद डुप्लेक्सिंग के कारण, और मैं समय सीमा पर हूं इसलिए उस समय के निचले भाग तक पहुंचने के लिए समय नहीं मिला है।

उत्तर

1

ठीक है, तो इस तरह मैंने इसे हल किया। IMHO यह एक हैक है लेकिन कम से कम यह काम करता है।

असल में, मुझे "*" बाइंडिंग जोड़ने की ज़रूरत है, इसलिए मैं इसे पावरहेल में कर सकता हूं। सामान्य नुस्खा यहां है: http://blogs.msdn.com/b/tomholl/archive/2011/06/28/hosting-services-with-was-and-iis-on-windows-azure.aspx

जो नामित पाइप्स समर्थन जोड़ने के साथ संबंधित है, लेकिन सिद्धांत समान है। मैं बस के लिए PowerShell स्क्रिप्ट बदल दिया है:

import-module WebAdministration 
# Set up a binding to 8080 for the services 
Get-WebSite "*Web*" | Foreach-Object { 
    $site = $_; 
    $siteref = "IIS:/Sites/" + $site.Name; 
    New-ItemProperty $siteref -name bindings -value @{protocol="http";bindingInformation="*:8080:"} 
} 

यह अब मुझे मेरी सेवा का उपयोग करने http://127.0.0.1:8080/service.svc उपयोग करने के लिए अनुमति देता है।

ध्यान दें: आप तो यह पालन करें ध्यान से

+0

कॉल करना चाहते हैं? – BozoJoe

4

आप अंत बिंदु का पता गतिशील रूप से बनाने की कोई ऊंचा निष्पादन संदर्भ सेट और powershell निष्पादन मोड बदलने के लिए नुस्खा के बाकी का पालन करने की आवश्यकता है,।

चरण 1: आपकी सेवा में Definition.csdef आपको एक एंडपॉइंट घोषित करने की आवश्यकता है।

<ServiceDefinition name="MyFirstAzureWorkflow" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"> 
    <WebRole name="WorkflowWeb" vmsize="ExtraSmall"> 
    <Sites> 
     <Site name="Web"> 
     <Bindings> 
      <Binding name="Endpoint1" endpointName="WorkflowService" /> 
     </Bindings> 
     </Site> 
    </Sites> 
    <Endpoints> 
     <InputEndpoint name="WorkflowService" protocol="http" port="80" /> 
    </Endpoints> 
    <Imports> 
     <Import moduleName="Diagnostics" /> 
    </Imports> 
    </WebRole> 
</ServiceDefinition> 

चरण 2: आप किसी को भी कह सकते हैं क्यों यह बाध्यकारी नहीं है पहले से ही उपलब्ध है जब भूमिका बनाई गई है सेवा

var endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["WorkflowService"].IPEndpoint; 
var uri = new Uri(string.Format(
    "http://{0}:{1}/MyService.xamlx", 
    endpoint.Address, 
    endpoint.Port)); 
var proxy = new ServiceClient(
    new BasicHttpBinding(), 
    new EndpointAddress(uri)); 
+0

धन्यवाद रॉन। मैंने ऐसा कुछ किया और जब मेरा कोड सेवा कॉल करता है तो यह ठीक काम करता है, मैं डब्ल्यूसीएफ रूटिंग सेवा का उपयोग करता हूं और मैं (आसानी से) नियंत्रित नहीं कर सकता कि रूटिंग सेवा एंडपॉइंट्स कैसे बनाती है, इसलिए वेब पर निर्भर होना चाहिए। config। हालांकि सामान्य मामले का अच्छा जवाब है, और पुष्टि करता है कि मैं पागल नहीं हूं इसलिए +1। – Frans

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