开发者

How to add a new item in a sharepoint list using web services in C sharp

开发者 https://www.devze.com 2022-12-30 18:28 出处:网络
I\'m trying to add a new item to a sharepoint list from a winform application in c# using web services. As only result, I\'m getting the useless exception \"Exception of type \'Microsoft.SharePoint.So

I'm trying to add a new item to a sharepoint list from a winform application in c# using web services. As only result, I'm getting the useless exception "Exception of type 'Microsoft.SharePoint.SoapServer.SoapServerException' was thrown."

I have a web reference named WebSrvRef to http://server/site/subsite/_vti_bin/Lists.asmx

And this code:

        XmlDocument xmlDoc;
        XmlElement elBatch;
        XmlNode ndReturn;
        string[] sValues;
        string sListGUID;
        string sViewGUID;

        if (lstResults.Items.Count < 1)
        {
            MessageBox.Show("Unable to Add To SharePoint\n" +
                "No test file processed. The list is blank.", 
                "Add To SharePoint", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            return;
        }

        WebSrvRef.Lists listService = new WebSrvRef.Lists();
        sViewGUID = "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}"; // Test List View GUID
        sListGUID = "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}"; // Test List GUID

        listService.Credentials= System.Net.CredentialCache.DefaultCredentials;

        frmAddToSharePoint dlgAddSharePoint = new frmAddToSharePoint();
        if (dlgAddSharePoint.ShowDialog() == DialogResult.Cancel)
        {
            dlgAddSharePoint.Dispose();
            listService.Dispose();
            return;
        }

        sValues = dlgAddSharePoint.Tag.ToString().Split('~');
        dlgAddSharePoint.Dispose();

        string strBatch = "<Method ID='1' Cmd='New'>" +
            "<Field Name='Client#'>" + sValues[0] + "</Field>" +
            "<Field Name='Company'>" + sValues[1] + "</Field>" +
            "<Field Name='Contact Name'>" + sValues[2] + "</Field>" +
            "<Field Name='Phone Number'>" + sValues[3] + "</Field>" +
            "<Field Name='Brand'>" + sValues[4] + "</Field>" +
            "<Field Name='Model'>" + sValues[5] + "</Field>" +
            "<Field Name='DPI'>" + sValues[6] + "</Field>" +
            "<Field Name='Color'>" + sValues[7] + "</Field>" +
            "<Field Name='Compression'>" + sValues[8] + "</Field>" +
            "<Field Name='Value %开发者_JAVA百科 1'>" + (((float)lstResults.Groups["Value 1"].Tag)*100).ToString("##0.00") + "</Field>" +
            "<Field Name='Value % 2'>" + (((float)lstResults.Groups["Value 2"].Tag)*100).ToString("##0.00") + "</Field>" +
            "<Field Name='Value % 3'>" + (((float)lstResults.Groups["Value 3"].Tag)*100).ToString("##0.00") + "</Field>" +
            "<Field Name='Value % 4'>" + (((float)lstResults.Groups["Value 4"].Tag)*100).ToString("##0.00") + "</Field>" +
            "<Field Name='Value % 5'>" + (((float)lstResults.Groups["Value 5"].Tag)*100).ToString("##0.00") + "</Field>" +
            "<Field Name='Comments'></Field>" +
            "<Field Name='Overall'>" + (fTotalScore*100).ToString("##0.00") + "</Field>" +
            "<Field Name='Average'>" + (fTotalAvg * 100).ToString("##0.00") + "</Field>" +
            "<Field Name='Transfered'>" + sValues[9] + "</Field>" +
            "<Field Name='Notes'>" + sValues[10] + "</Field>" +
            "<Field Name='Resolved'>" + sValues[11] + "</Field>" +
            "</Method>";

        try
        {
            xmlDoc = new System.Xml.XmlDocument();
            elBatch = xmlDoc.CreateElement("Batch");

            elBatch.SetAttribute("OnError", "Continue");
            elBatch.SetAttribute("ListVersion", "1");
            elBatch.SetAttribute("ViewName", sViewGUID);

            strBatch = strBatch.Replace("&", "&amp;");
            elBatch.InnerXml = strBatch;

            ndReturn = listService.UpdateListItems(sListGUID, elBatch);

            MessageBox.Show(ndReturn.OuterXml);
            listService.Dispose();                
        }
        catch(Exception Ex)
        {
            MessageBox.Show(Ex.Message +
                "\n\nSource\n" + Ex.Source +
                "\n\nTargetSite\n" + Ex.TargetSite +
                "\n\nStackTrace\n" + Ex.StackTrace, 
                "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            listService.Dispose();
        }

What am I doing wrong? What am I missing? Please help!!

Frank


It's most likely due to this line:

listService.Credentials= System.Net.CredentialCache.DefaultCredentials;

Change that to a set userid/password like this:

listService.Credentials = new NetworkCredential("UserID", "Password");

Make sure the UserID/Password has access to create lists, etc.


If the NeworkCredential isn't the answer, you should also be sure that you're using the correct field names.

The "Field Name" should be the "FieldInternalName" for the SharePoint list fields. To get the FieldInternalName of the field, in SharePoint select "New" from the list and then "View Source" of that page (right click any where in the "New" form page). You will see the fields along with their internal names near the end of the source file.


OK, it works now. Here is what I got wrong:

I was not using the FieldInternalName -> Thanks to Robert Williams

I was also missing this line because even if I my Web Reference is pointing to the proper location, my listService.List still points to the server root site.

listService.Url = @"http://server/site/subsite/_vti_bin/Lists.asmx";


The soap exception will have a details node with a more helpful error description. Catch it in a debugger and drill into it.

0

精彩评论

暂无评论...
验证码 换一张
取 消