none
There is an error in XML document RRS feed

  • 问题

  • 我在一个aspx里面写了如下代码:

    using (new CrmImpersonator())

    {

        Guid recid = new Guid("90250294-5cd1-dd11-b3e3-0003ff362166");
        CrmAuthenticationToken token = CrmAuthenticationToken.ExtractCrmAuthenticationToken(Context, "MicrosoftCRM");
        token.AuthenticationType = 0;
        token.OrganizationName = "MicrosoftCRM";
        CrmService service = new CrmService();
        service.Url = "http://localhost:5555/mscrmservices/2007/crmservice.asmx";
        service.CrmAuthenticationTokenValue = token;
        service.Credentials = System.Net.CredentialCache.DefaultCredentials;
        
        ColumnSet cs = new ColumnSet();
        cs.AddColumns(new String[]{"subject","description"});
        activitypointer caller = (activitypointer)service.Retrieve(EntityName.activitypointer.ToString(), recid, cs);
        //Owner client = caller.ownerid;
        this.taskname.Text = caller.subject;
        //this.clientname.Text = client.Value.ToString();
        this.TextBox1.Text = caller.description;

    }

    但执行到service.retrive的时候报错:There is an error in XML document,这是怎么回事?

    另外,为什么sdk中的ColumnSet.Attributes一个是只读,一个是可读可写?如何才能声明一个可读可写的ColumnSet?我在前面using Sdk.query,但声明出来的ColumnSet.Attributes是只读的 why?

    2009年1月5日 10:12

答案

全部回复

  • 我看了下,引用dll的话这个ColumnSet.Attributes是只读的,引用web service 的话ColumnSet.Attributes是可写的,但现在我只有dll,用了ColumnSet.AddColumns()之后仍然报There is an error in XML document的错,何解?

    2009年1月6日 1:10
  • 应该是你返回的xml格式不正确,或者根本就没有返回xml(如页面错误信息)
    2009年1月6日 1:21
  •  

    我是在asp中用service.retrive(entityname,guid,columnset),这是sdk中的例子:contact contact = (contact)service.Retrieve(EntityName.contact.ToString(), contactGuid, cols);根本不用返回xml啊

    不过sdk中用的是webreference,我现在引用的是dll(因为我要在asp中使用Crmservice,所以要使用CrmImpersonator ,而引用webreference的话是不能使用CrmImpersonator 的,对不对?),如果这样的话该怎么处理?

    2009年1月6日 1:52
  • asp好像只能使用SOAP ToolKit来调用Web Service,如果有现成的dll提供了这样的功能,使用现成的dll也应当可以
    如果使用asp.net则会好处理些
    2009年1月6日 3:21
  •  孟宪会 写:
    asp好像只能使用SOAP ToolKit来调用Web Service,如果有现成的dll提供了这样的功能,使用现成的dll也应当可以
    如果使用asp.net则会好处理些

    我用的是aspnet,我建的一个web Application project,能告诉一下怎么处理吗?被这个问题折腾了好几天,谢谢

    2009年1月6日 3:24
  • 干脆说说我的需求算了:

    我要实现在crm的grid页面加一个按钮,点击这个按钮之后弹出一个自定义aspx页面,然后这个页面上有几个textbox,里面的值取自于crm grid页面中选中的那条记录,同时这个aspx页面上有几个按钮,每次点击之后都会反过去更新那条选中的记录,该如何实现?在aspx页面中该引用webservice呢还是dll?

     

    2009年1月6日 3:57
  • 引用webservice还是dll都是可以的。不过推荐用dll
    2009年1月6日 7:48
    版主
  • 问题是我引用dll的话会报如标题所示的错误,代码如上。而我用webreference的话,又不能使用crmimpersonate。

    现在我试了一下,用的是webreference,现在还没报验证错误,只是有时候会出现outofmemory异常,是跟身份验证有关的,不过做了些操作比如清除cookie,重启iis等,过会又好了。我也不知道那个crmimpersonate是不是一定要用?

    2009年1月6日 7:56
  • crmimpersonate不一定要用的.

     

    Authentication from an ASPX Page

     

    using System;
    using System.Collections;
    using System.Configuration;
    using System.Data;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using Microsoft.Crm.Sdk;
    using Microsoft.Crm.SdkTypeProxy;
    using Microsoft.Win32;
    
    namespace WebApplication1
    {
        public partial class _Default : System.Web.UI.Page
        {
            public string orgname;
            public string crmurl;
            public string metaurl;
            public bool offline;
    
            protected void Page_Load(object sender, EventArgs e)
            {
                #region CRM URLs and Organization Name
    
                //Determine Offline State from Host Name
                Response.Write(Request.Url.Host.ToString());
                if (Request.Url.Host.ToString() == "127.0.0.1")
                {
                    offline = true;
    
                    //Retrieve the Port and OrgName from the Registry
                    RegistryKey regkey = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\MSCRMClient");
                    orgname = regkey.GetValue("ClientAuthOrganizationName").ToString();
                    string portnumber = regkey.GetValue("CassiniPort").ToString();
    
                    //Construct the URLs
                    string baseurl = "http://localhost:" + portnumber + "/mscrmservices/2007/";
                    crmurl = baseurl + "crmservice.asmx";
                    metaurl = baseurl + "metadataservice.asmx";
                }
                else
                {
                    offline = false;
    
                    //Retrieve the URLs from the Registry
                    RegistryKey regkey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\MSCRM");
                    string ServerUrl = regkey.GetValue("ServerUrl").ToString();
                    crmurl = ServerUrl + "/2007/crmservice.asmx";
                    metaurl = ServerUrl + "/2007/metadataservice.asmx";
    
                    //Retrieve the Query String from the current URL
                    if (Request.QueryString["orgname"] == null)
                    {
                        orgname = string.Empty;
                    }
                    else
                    {
                        //Query String
                        string orgquerystring = Request.QueryString["orgname"].ToString();
                        if (string.IsNullOrEmpty(orgquerystring))
                        {
                            orgname = string.Empty;
                        }
                        else
                        {
                            orgname = orgquerystring;
                        }
                    }
    
                    if (string.IsNullOrEmpty(orgname))
                    {
                        //Windows Auth URL
                        if (Request.Url.Segments[2].TrimEnd('/').ToLower() == "isv")
                        {
                            orgname = Request.Url.Segments[1].TrimEnd('/').ToLower();
                        }
    
                        //IFD URL
                        if (string.IsNullOrEmpty(orgname))
                        {
                            string url = Request.Url.ToString().ToLower();
                            int start = url.IndexOf("://") + 3;
                            orgname = url.Substring(start, url.IndexOf(".") - start);
                        }
                    }
                }
    
                #endregion
    
                using (new CrmImpersonator())
                {
                    CrmAuthenticationToken token;
                    if (offline == true)
                    {
                        token = new CrmAuthenticationToken();
                    }
                    else
                    {
                        // Notice that the Context parameter value is Page.Context.
                        token = CrmAuthenticationToken.ExtractCrmAuthenticationToken(Context, orgname);
                    }
                    token.OrganizationName = orgname;
                    token.AuthenticationType = 0;
    
                    //Create the Service
                    CrmService service = new CrmService();
                    service.Credentials = System.Net.CredentialCache.DefaultCredentials;
                    service.CrmAuthenticationTokenValue = token;
                    service.Url = crmurl;
    
                // This code shows how to create the metadata service.
                // It is not used in this sample.
                // MetadataService meta = new MetadataService();
                // meta.CrmAuthenticationTokenValue = token;
                // meta.Credentials = CredentialCache.DefaultCredentials;
                // meta.Url = "http://localhost/mscrmservices/2007/MetadataService.asmx";
    
    
                    account account = new account();
                    account.name = "Offline Impersonator: " + DateTime.Now.TimeOfDay.ToString();
                    if (offline == false)
                        // Explicitly set the owner ID for the record if not offline.
                        account.ownerid = new Owner("systemuser", token.CallerId);
    
                    service.Create(account);
                }
    
                Response.Write("Done");
            }
        }
    }
    2009年1月6日 8:22
    版主
  • 那在什么情况下才用crmimpersonate呢?

     

    最重要的是,我用DLL的话就会报错啊:there is an error in XML document,用webreference就不会,这个问题让我困扰了好久。

     

    2009年1月6日 9:39
  •  

    ColumnSet cs = new ColumnSet();
    cs.AddColumns(new String[]{"subject","description"});

    activitypointer caller = (activitypointer)service.Retrieve(EntityName.activitypointer.ToString(), recid, cs);


    替换为

    activitypointer caller = (activitypointer)service.Retrieve(EntityName.activitypointer.ToString(), recid, new AllColumns());

     

    试下

    2009年1月6日 10:13
    版主
  • 调试下:

    try
    {
       activitypointer caller = (activitypointer)service.Retrieve(EntityName.activitypointer.ToString(), recid, cs);
    }
    catch(System.Web.Services.Protocols.SoapException ex)
    {
       Console.WriteLine(ex.Message + ". " + ex.Detail.InnerText);
    }

     

    2009年1月6日 10:21
    版主
  • 刚刚查了下sdk activitypointer class 并不提供 Retrieve Message,只有RetrieveMultipleRollup
    2009年1月7日 5:43
    版主
  • 事实证明 引用sdk和WebService的效果还是有所不一样的

    2009年1月7日 7:26