Silverlight 2, Невозможно обновить ссылку на службу с помощью новой службы - PullRequest
1 голос
/ 30 августа 2009

В Silverlight 2 я пытаюсь добавить новую службу, которая будет возвращать объект, содержащий два списка из службы WCF, в приложение Silverlight на клиенте. Файл svc и interface уже содержит два контракта, которые работают и используются. После добавления новой службы я нажимаю на «Обновить ссылку на службу» в приложении Silverlight и получаю сообщение об ошибке:

There was an error downloading "http://localhost:3005/CMS.svc"  ...

Metadata contains a reference that cannot be resolved "http://localhost:3005/CMS.svc" ...The client and service bindings may be mismatched...

Несмотря на то, что проект веб-службы перестраивается без ошибок, я думаю, что должно быть что-то не так с тем, как я определил службу в проекте веб-службы, потому что, когда я удаляю новую службу, остальные две службы обновляются в порядке, и если я добавлю новый сервис, который, я знаю, в порядке, ссылка на сервис обновится. Поэтому я не думаю, что это проблема конечных точек или номера порта и т. Д.

Предполагается, что новый сервис вернет объект, который содержит два списка.

Вот код:

В файле интерфейса:

namespace CMSSilverlight.Web
{
  // NOTE: If you change the interface name "ICMS" here, you must also update the reference to "ICMS" in Web.config.
  [ServiceContract]
  public interface ICMS
  {

    [OperationContract]
    POCollection GetPOCollection(String s);

  }


  [DataContract]
  public class POCollection
  {
    [DataMember]
    public IList<Employee> em;
    [DataMember]
    public IList<School> sc;
  }

  public class Employee
  {
    public string EmpID { get; set; }
    public string EmpName { get; set; }
    public Employee(string empID, string empName)
    {
      this.EmpID = empID;
      this.EmpName = empName;
    }
  }

  public class School
  {
    public string SchID { get; set; }
    public string SchName { get; set; }
    public School(string schID, string schName)
    {
      this.SchID = schID;
      this.SchName = schName;
    }
  }
}

В служебном файле:

namespace CMSSilverlight.Web
{
  {

    public POCollection GetPOCollection(String sParam)
    {
      IList<Employee> empList = new List<Employee>();
      for (int i = 0; i < 5; i++)
      {
        empList.Add(new Employee(i.ToString(), i.ToString() + " Emp Name"));
      }

      IList<School> schList = new List<School>();
      for (int i = 0; i < 5; i++)
      {
        schList.Add(new School(i.ToString(), i.ToString() + " Sch Name"));
      }

      POCollection po = new POCollection()
      {
        em = empList,
        sc = schList
      };

      return po;

    }
  }
}

1 Ответ

0 голосов
/ 31 августа 2009

Джеймс,

Большое спасибо - я должен был хотя бы об этом. Во всяком случае ниже была ошибка. Нужно было просто добавить атрибут [DataContractAttribute] в классы Employee и School, и все работало нормально. Это расстраивающий процесс обучения, но приятно, когда решение найдено.

An ExceptionDetail, likely created by `IncludeExceptionDetailInFaults=true`, whose value is:
System.InvalidOperationException: An exception was thrown in a call to a WSDL export extension: System.ServiceModel.Description.DataContractSerializerOperationBehavior
 contract: http://tempuri.org/:ICMS ----> System.Runtime.Serialization.InvalidDataContractException: Type 'CMSSilverlight.Web.Employee' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute.  See the Microsoft .NET Framework documentation for other supported types.
...