2009-04-24 10 views
7

मैं एक Winforms C# 2.0 एप्लिकेशन लिख रहा हूं जिसे XML फ़ाइल को SharePoint पर दस्तावेज़ लायब्रेरी में रखने की आवश्यकता है।वेब सेवा के उपयोग से आप फ़ाइल को SharePoint में कैसे कॉपी करते हैं?

मैं ऑब्जेक्ट मॉडल (यहां संदर्भ के लिए कोई sharepoint.dll)

मैं वर्तमान में http://webserver/site/_vti_bin/copy.asmx वेब सेवा का उपयोग कर रहा उपयोग करने के बजाय एक WebService उपयोग करना चाहते हैं।

byte[] xmlByteArray; 
using (MemoryStream memoryStream = new MemoryStream()) 
{ 
    xmlDocument.Save(memoryStream); 
    xmlBytes = memoryStream.ToArray(); 
} 

string[] destinationUrlArray = new string[] {"http://webserver/site/Doclib/UploadedDocument.xml"}; 

FieldInformation fieldInfo = new FieldInformation(); 
FieldInformation[] fields = { fieldInfo }; 


CopyResult[] resultsArray; 

using (Copy copyService = new Copy()) 
{ 
    copyService.Credentials = CredentialCache.DefaultCredentials; 
    copyService.Url = "http://webserver/site/_vti_bin/copy.asmx"; 

    copyService.Timeout = 600000; 

    uint documentId = copyService.CopyIntoItems("", destinationUrlArray, fields, xmlByteArray, out resultsArray); 
} 

जब इस कोड को चलाता है, मैं resultsArray बाहर पैरामीटर में एक भी परिणाम प्राप्त:

यहाँ कुछ कोड है

DestinationURL: "http://webserver/site/Doclib/UploadedDocument.xml" 
ErrorCode: UnKnown 
ErrorMessage: "Object reference not set to an instance of an object." 

मेरी खोज से, मैं संभव के एक जोड़े पाया है मदद करता है.

  • Microsoft TechNet - "copy.asmx copyintoitems केवल तभी स्रोत और गंतव्य यूआरएल एक ही SPWebApplication (साइट संग्रह) में हैं काम करेंगे।"

  • Microsoft Social - "ऑब्जेक्ट संदर्भ किसी ऑब्जेक्ट त्रुटि के उदाहरण पर सेट नहीं है क्योंकि SharePoint उस विशेष संपत्ति को पहचानने में सक्षम नहीं है।"

इससे मुझे विश्वास होता है कि मेरा स्रोत यूआरएल कुछ पर सेट किया जाना चाहिए, लेकिन क्या? यह क्लाइंट वर्कस्टेशन से निकल रहा है और इसमें कोई स्रोत यूआरएल नहीं है।

किसी भी मदद की सराहना की जाएगी।

हांक आप,
कीथ

+0

http://geek.hubkey.com/2007/10/upload-file-to-sharepoint-document.html –

उत्तर

1

वर्तमान में क्या काम कर रहा है:

WebRequest request = WebRequest.Create(“http://webserver/site/Doclib/UploadedDocument.xml”); 
request.Credentials = CredentialCache.DefaultCredentials; 
request.Method = "PUT"; 
byte[] buffer = new byte[1024]; 
using (Stream stream = request.GetRequestStream()) 
{ 
    using (MemoryStream memoryStream = new MemoryStream()) 
    { 
     dataFile.MMRXmlData.Save(memoryStream); 
     memoryStream.Seek(0, SeekOrigin.Begin); 
     for (int i = memoryStream.Read(buffer, 0, buffer.Length); i > 0; 
      i = memoryStream.Read(buffer, 0, buffer.Length)) 
     { 
      stream.Write(buffer, 0, i); 
     } 
    } 
} 

WebResponse response = request.GetResponse(); 
response.Close(); 

तो ... किसी को भी अगर यह "डाल" के रूप में एक राय है विधि एक का उपयोग करने से SharePoint वातावरण में बेहतर है अंतर्निहित webservice?

अभी मुझे कहना होगा कि यह "PUT" विधि बेहतर है क्योंकि यह काम करता है और मुझे वेब सेवा को काम नहीं मिल सका।

कीथ

+0

यहां स्रोत है जिसका मैंने उपयोग किया था: http://geek.hubkey.com/2007/10/upload-file-to-sharepoint-document.html –

0

यहाँ कुछ कोड मैं थोड़ी देर के लिए लिखा था (मैं माफी माँगता हूँ, मैं एक साथ यह भोजन टुकड़ा करने के लिए मिला है, लेकिन उम्मीद है कि आपको इसके बारे में समझ गए होंगे)

है
// Create a request using a URL that can receive a post. 
WebRequest request = WebRequest.Create("http://sharepointsite/somefile.txt"); 

// Set the Method property of the request to POST. 
request.Method = "PUT" 

Stream dataStream; 

// Set the ContentType property of the WebRequest. 
request.ContentType = "multipart/form-data; charset=ISO-8859-1"; 

byte[] byteArray = File.ReadAllBytes(@"c:\somefile.txt"); 

// Set the ContentLength property of the WebRequest. 
request.ContentLength = byteArray.Length; 

// Get the request stream. 
dataStream = request.GetRequestStream(); 

// Write the data to the request stream. 
dataStream.Write(byteArray, 0, byteArray.Length); 

// Close the Stream object. 
dataStream.Close(); 

// Get the response. 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
HttpStatusCode statCode = response.StatusCode; 

// Get the stream containing content returned by the server. 
dataStream = response.GetResponseStream(); 
// Open the stream using a StreamReader for easy access. 
StreamReader reader = new StreamReader(dataStream); 
// Read the content. 
string responseFromServer = reader.ReadToEnd(); 

// Clean up the streams. 
reader.Close(); 
dataStream.Close(); 
response.Close(); 
-1

मुझे यह नहीं मिला, आप UpdateListItems की बजाय प्रतिलिपि का उपयोग क्यों कर रहे हैं। शायद UpdateListItems एक बेहतर मैच होगा?

+0

कॉपी पुस्तकालयों में फ़ाइलों को अपलोड करने के लिए प्रतिलिपि का उपयोग किया जाता है जबकि सूचियों के लिए UpdateListItems (उदाहरण: कार्य)। –

1

आपका कोड ठीक है, बस खाली स्ट्रिंग के बजाय गंतव्य यूआरएल का उपयोग करें। नीचे देखें:

byte[] xmlByteArray; 
using (MemoryStream memoryStream = new MemoryStream()) 
{ 
    xmlDocument.Save(memoryStream); 
    xmlBytes = memoryStream.ToArray(); 
} 

string destinationUrl = “http://webserver/site/Doclib/UploadedDocument.xml” 
string[] destinationUrlArray = new string[] { destinationUrl }; 

FieldInformation fieldInfo = new FieldInformation(); 
FieldInformation[] fields = { fieldInfo }; 


CopyResult[] resultsArray; 

using (Copy copyService = new Copy()) 
{ 
    copyService.Credentials = CredentialCache.DefaultCredentials; 
    copyService.Url = "http://webserver/site/_vti_bin/copy.asmx"; 

    copyService.Timeout = 600000; 

    uint documentId = copyService.CopyIntoItems(destinationUrl , destinationUrlArray, fields, xmlByteArray, out resultsArray); 
} 
+0

क्या मुझे कुछ याद आ रहा है? मैं अभी भी SourceURL पैरामीटर को खाली स्ट्रिंग के रूप में देखता हूं? मैंने उस पैरामीटर को "http: //webserver/site/Doclib/UploadedDocument.xml" से भर दिया है और यह तब भी वही परिणाम देता है जब भाग गया। कीथ –

+0

क्षमा करें, मैं मूर्ख हूँ। मैं पैरामीटर से चूक गया। दिलचस्प है कि आपको अभी भी कोई समस्या है क्योंकि आपका कोड मेरी मशीन पर मीठा चलता है। – Nat

+0

क्या आप इस कोड को उसी मशीन पर अपने शेयरपॉइंट इंस्टेंस के रूप में चला रहे हैं? मेरे सहकर्मी के पास यह कोड भी चल रहा है, लेकिन यह उसी एसपी इंस्टेंस के समान मशीन पर है। मैं अपनी मशीन पर कोड चला रहा हूं, लेकिन मेरा एसपी वास्तविक दुनिया स्थितियों को दोहराने में मदद के लिए वर्चुअल मशीन में चल रहा है। रुचि है अगर यह अंतर्निहित मुद्दा है। –

6

मैं जानता हूँ कि यह एक पुरानी धागा है, लेकिन यह आ रहा है के रूप में मैं एक ही समस्या के समाधान के लिए खोज रहा था रखा।

इस धागे http://social.msdn.microsoft.com/Forums/en-SG/sharepointdevelopment/thread/833e38a8-f13c-490d-8ba7-b889b6b25e38 पर स्टीव कुरान के उत्तर की जांच करें। ऐसा लगता है कि मूल रूप से अनुरोध विफल रहता है क्योंकि गंतव्य यूआरएल को हल नहीं किया जा सकता है।

(एक नई stackflow उपयोगकर्ता की सीमाएं -। एक से अधिक लिंक पोस्ट नहीं कर सकते आराम के लिए मेरी टिप्पणी देखें) अगर यह आपकी समस्या का समाधान होगा, लेकिन

पैट

+3

(यहां बाकी है) मैंने शेयरपॉइंट वैकल्पिक एक्सेस सेट अप किया यहां अपने लेख के अनुसार मैपिंग http: //blogs.msdn।कॉम/शेयरपॉइंट/आर्काइव/2007/03/06/क्या-हर-शेयरपॉइंट-एडमिनिस्ट्रेटर-ज़रूरत-के बारे में-वैकल्पिक-पहुंच-मैपिंग-भाग-1.aspx (केवल मानचित्रण भाग - प्रॉक्सी बिट नहीं) और - सफलता। एक अन्य अनुरोध विवरण, 'SourceUrl' खाली नहीं हो सकता है लेकिन इसे वैध यूआरएल होना आवश्यक नहीं है। 'फ़ील्ड' खाली हो सकता है। एक अन्य विवरण - मैं क्लाइंट के रूप में पाइथन सूड का उपयोग कर रहा हूं। pat – pat

+0

+1 आपको डबल-यूआरएल के करीब लाने के लिए :) – xdhmoore

0

मुझे यकीन है कि नहीं हूँ, जब आप webservice का संदर्भ देते हैं, तो URL के [साइट] भाग का उपयोग न करें।

इसके बजाय प्रयास करें: http: // [server]/_vti_bin/[webservice]।

मैं एसपी में एक विशेषज्ञ नहीं हूं लेकिन मुझे पूरा यकीन है कि वेब सर्विसेज मुख्य सर्वर से संबंधित है, न कि एक विशिष्ट साइट पर।

उम्मीद है कि यह मदद करता है।

+0

वेब सेवाएं साइट विशिष्ट हैं, सर्वर विशिष्ट नहीं हैं। – JimmyBoh

1

जब मैं डिफ़ॉल्ट क्रेडेंशियल्स का उपयोग करता हूं तो मुझे वही संदेश मिलता है। उन्हें इस जगह का प्रयास करें:

copyWebService.Credentials 
    = new NetworkCredential("Administrator", "pass", "MyDomain"); 
0

मैं एक समान समस्या थी, यह पता चला कि ग्राहक NTLM सुरक्षा का उपयोग करने के लिए कॉन्फ़िगर किया गया है, लेकिन कोई NTLM हैडर जुड़ा था।

मैं अपने मामले, तथ्य यह है कि मैं एक ASP.NET applicaton के सर्वर साइड पर इस कोड का उपयोग किया गया था की वजह से, Windows प्रमाणीकरण सक्षम करने के लिए था और सेट

पहचान के प्रतिरूपण = "true"

Server.web सेक्शन में

0

अगर आपके SharePoint सर्वर एक खेत पर बनाया गया है, अपने "वैकल्पिक पहुँच मैपिंग" की जांच करके देखें कि क्या कोई प्रविष्टि है: yourwebserverurl इंट्रानेट yourwebserverurl यदि नहीं, तो जोड़ें।

मेरे मामले के लिए, इसे जोड़ने के बाद, कॉपी सेवा काम करना शुरू कर देती है।

शायद यह फार्म लोड बैलेंस पते से संबंधित हल हो सकता है।

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

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