2012-09-20 7 views
6

मैं एक पावरहेल स्क्रिप्ट लिख रहा हूं जो हर 10 मिनट में साबुन webservice को गर्म और जीवंत रखने के लिए पिंग करेगा ताकि प्रदर्शन बढ़े। हमने आईआईएस में आवेदन पूल निष्क्रिय टाइमआउट के साथ कई तकनीकों का प्रयास किया है और बस wsdl के लिए http req बना रहा है। लेकिन ऐसा लगता है कि हमें वास्तविक अनुरोध करना है जो एसक्यूएल सर्वर पर जाता है और 90 मिनट के लिए निष्क्रिय होने से यह आवश्यकताओं के लिए धीमा हो जाएगा।पावरहेल में साबुन कॉम्प्लेक्स का उपभोग करने के लिए एक साबुन सेवा रखने के लिए टाइप करें

मुझे एक स्मार्ट खोज करने में सक्षम होने के लिए एक जटिल खोज वस्तु बनाना है जो servicelayer को कैश और गर्म रखेगा। साबुन अनुरोध इस तरह दिखना चाहिए:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:fund="http://www.example.com/cmw/fff/fund" xmlns:tcm="http://www.example.com/cmw/fff/"> 
    <soapenv:Body> 
    <fund:Get> 
     <!--Optional:--> 
     <fund:inputDTO> 
      <fund:Fund> 
       <fund:Identity> 
       <fund:Isin>SE9900558666</fund:Isin> 
       <fund:FundBaseCurrencyId>SEK</fund:FundBaseCurrencyId> 
       </fund:Identity> 
      </fund:Fund> 
      <fund:InputContext> 
       <tcm:ExtChannelId>Channelman</tcm:ExtChannelId> 
       <tcm:ExtId>Rubberduck</tcm:ExtId> 
       <tcm:ExtPosReference>Rubberduck</tcm:ExtPosReference> 
       <tcm:ExtUser>Rubberduck</tcm:ExtUser> 
       <tcm:LanguageId>809</tcm:LanguageId> 
      </fund:InputContext> 
     </fund:inputDTO> 
    </fund:Get> 
    </soapenv:Body> 
</soapenv:Envelope>` 

मैं न्यू-WebServiceProxy जो this example by powershellguy में इतने सुंदर ढंग से काम का उपयोग करने का प्रयास करें। मैं my own Objects as this example from technet का निर्माण करता हूं।

powershell कोड मैं अब तक की कोशिश की है:

$fundSrvc = New-WebServiceProxy -uri http://myColdServer:82/WSFund.svc?wsdl -NameSpace "tcm" 
# all the type are now defined since we called New-WebServiceProxy they are prefixed 
# with ns tcm 
[tcm.FundInput] $myFundGoofer = new-object tcm.FundInput 
[tcm.Fund] $myFund = new-object tcm.Fund 
[tcm.Context] $myInputContext = new-object tcm.Context 
[tcm.FundIdentity] $myFundIdentity = New-Object tcm.FundIdentity 
# Use these commands to get member of the objects you want to investigat 
# $myFundGoofer |Get-Member 
# $myFund |Get-Member 
# $myInputContext |Get-Member 
# $myFundIdentity |Get-Member 
$myFundIdentity.Isin="SE9900558666" 
$myFundIdentity.FundBaseCurrencyId="SEK" 
$myInputContext.ExtChannelId="ChannelMan" 
$myInputContext.ExtId="RubberDuck" 
$myInputContext.ExtPosReference="RubberDuck" 
$myInputContext.ExtUser="RubberDuck" 
$myInputContext.LanguageId="809" 
$myFund.Identity=$myFundIdentity 

$myFundGoofer.Fund = $myFund 
$myFundGoofer.InputContext = $myInputContext 

#Tada 
$fundSrvc.Get($myFundGoofer) 

त्रुटि संदेश मेरे लिए कोई मतलब नहीं है। इसकी ध्वनियों की तरह: Cannot convert the "tcm.FundInput" value of type "tcm.FundInput" to type "tcm.FundInput"

Cannot convert argument "0", with value: "tcm.FundInput", for "Get" to type "tcm.FundInput": "Cannot convert the "tcm.FundInput" value of type "tcm.FundInput" to type "tcm.FundInput"." 
At C:\scripts\Service-TestTCM6.ps1:31 char:14 
+ $fundSrvc.Get <<<< ($myFundGoofer) 
    + CategoryInfo   : NotSpecified: (:) [], MethodException 
    + FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument 
+3

आप इस की कोशिश की? http://www.sqlmusings.com/2012/02/04/resolving-ssrs-and-powershell-new-webserviceproxy-namespace-issue/ –

+0

नहीं, लेकिन अब मुझे लगता है कि यह समस्या आपके लिंक में वर्णित है यह एक बार चला सकता है और फिर मुझे नामस्थान बदलना होगा या पावरहेल को पुनरारंभ करना होगा। यह प्रत्येक पुनरारंभ करने के बाद काम करता है। धन्यवाद –

+0

उद्धरण में नामस्थान डालें मत। '$ fundSrvc = new-webServiceProxy -uri http: // myColdServer: 82/WSFund.svc? wsdl -NameSpace tcm' –

उत्तर

6

मैं लिंक है कि ईसाई पीछा किया (क्रेडिट उसे करने के लिए जाना चाहिए, लेकिन मैं ऐसा करने के लिए कैसे पता नहीं है) दे दी है और इसके बजाय डिफ़ॉल्ट नाम स्थान का इस्तेमाल किया। तो अब मुझे हर बार पावरहेल को पुनरारंभ करने की आवश्यकता नहीं है। हो सकता है कि प्रत्येक कॉल के बाद फंड एसआरवीसी ऑब्जेक्ट को मारने का एक और समाधान हो। लेकिन मैंने छोड़ दिया और डिफ़ॉल्ट बनाया पागल लंबे नामस्थान का उपयोग कर चला गया।

#note no -Namespace argument 
$fundSrvc = New-WebServiceProxy -uri "http://myColdServer/WSFund.svc?wsdl" 


#get autogenerated namespace 
$type = $fundSrvc.GetType().Namespace 
$myFundGooferDt = ($type + '.FundInput') 
$myFundDt = ($type + '.Fund') 
$myInputContextDt = ($type + '.Context') 
$myFundIdentityDt = ($type + '.FundIdentity') 
# Create the Objects needed 
$myFundGoofer = new-object ($myFundGooferDt) 
$myFund = new-object ($myFundDt) 
$myInputContext = new-object ($myInputContextDt) 
$myFundIdentity = New-Object $myFundIdentityDt 
# Assign values 
$myFundIdentity.Isin="SE9900558666" 
$myFundIdentity.FundBaseCurrencyId="SEK" 
$myInputContext.ExtChannelId="ChannelMan" 
$myInputContext.ExtId="RubberDuck" 
$myInputContext.ExtPosReference="RubberDuck" 
$myInputContext.ExtUser="RubberDuck" 
$myInputContext.LanguageId="809" 
$myFund.Identity=$myFundIdentity 

$myFundGoofer.Fund = $myFund 
$myFundGoofer.InputContext = $myInputContext 

#Tada 
$fundSrvc.Get($myFundGoofer) 
4

आपका मूल तकनीक सही है, तो आप सिर्फ भी नई-WebServiceProxy पर स्तरीय पैरामीटर शामिल करने की जरूरत:

यहाँ समाधान है कि काम करता है। अपने शेष कोड को छोड़ दें।

कल पावरशेल से एक webservice के साथ काम करते समय मुझे यह सही समस्या थी। मैंने ऑटो-जेनरेटेड नेमस्पेस की खोज करके यह भी काम किया था, लेकिन यह मेरी पसंद के लिए थोड़ा सा हैकी महसूस किया।

तो मैं समाधान यहाँ उल्लेख पाया: https://groups.google.com/d/msg/microsoft.public.windows.powershell/JWB5yueLtrg/k0zeUUxAkTMJ

+1

क्या आप कृपया एक छोटा सा उदाहरण जोड़ सकते हैं? –

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