2010-05-13 74 views
2

我正尝试使用Web服务将新项目从c#中的winform应用程序添加到SharePoint项目列表中。只有结果,我得到无用的异常“类型'Microsoft.SharePoint.SoapServer.SoapServerException'的异常被抛出。”如何使用C sharp中的Web服务在SharePoint列表中添加新项目

我有一个名为WebSrvRef的Web引用http://server/site/subsite/_vti_bin/Lists.asmx

而这种代码:

 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 % 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(); 
     } 

我在做什么错?我错过了什么? 请帮忙!!

弗兰克

回答

1

好吧,它现在有效。以下是我错了:

我没有使用FieldInternalName - >感谢罗伯特·威廉姆斯

我还缺少这行,因为即使我在我的Web引用指向正确的位置,我listService。列表仍然指向服务器根站点。

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

肥皂异常将有一个详细节点与更有帮助的错误说明。在调试器中抓住它并钻入它。

1

这很可能是由于该行:

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

修改成一组用户名/密码,就像这样:

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

确保用户ID /密码访问创建列表,等

+0

我改变了线这一: listService.Credentials =新的NetworkCredential( “用户ID”, “密码”, “域”); 仍然无法正常工作。如果我转到SharePoint站点的列表,我可以创建新项目。 我还没有尝试用调试器缓存错误。 – Frank 2010-05-13 18:00:22

1

如果NeworkCredential不是答案,那么您应该确定您使用的是正确的字段名称。

“字段名称”应该是SharePoint列表字段的“FieldInternalName”。要获取字段的FieldInternalName,请在SharePoint中从列表中选择“新建”,然后从该页面的“查看源代码”中右键单击“新建”窗体页面中的任何位置。您将在源文件结尾附近看到这些字段及其内部名称。

相关问题