2010-12-11 8 views
0

На прошлой неделе я создал веб-службу asmx, которая возвращает несколько строк с использованием мыла.WCF - возврат нескольких записей

Теперь я перехожу на WCF, и я хочу сделать то же самое.

В моем веб-службы ASMX я делаю следующее ..

public class sample 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public string NameOfFile { get; set; } 
    //public int Distance { get; set; } 
} 

[WebMethod] 
public sample[] Test(int count, float lat, float lng) 
{ 
    DataTable dt = new Gallery().DisplayNearestByLatLong(count, lat, lng); 
    var samples = new List<sample>(); 

    foreach (DataRow item in dt.Rows) 
    { 
     var s = new sample(); 
     s.Id = item[0].ToString(); 
     s.Name = item[1].ToString(); 
     s.NameOfFile = item[2].ToString(); 
     //s.Distance = (int)item[3]; 

     samples.Add(s); 
    } 
    return samples.ToArray(); 
} 

Этот код прекрасно работает, но теперь я хочу сделать то же самое, но с использованием WCF.

Моих текущих файлов WCF выглядеть следующим образом (я скопировал учебник, но есть установка контракт данных (который я думаю, нужен?))

GalleryWebService.cs 
public class GalleryWebService : IGalleryWebService 
{ 
    public string GetData(int value) 
    { 
     return string.Format("You entered: {0}", value); 
    } 

    public CompositeType GetDataUsingDataContract(CompositeType composite) 
    { 
     return composite; 
    } 

    public CompositeType GetTestData() 
    { 
     return new CompositeType(); 
    } 
} 

IGalleryWebService.cs

[ServiceContract] 
public interface IGalleryWebService 
{ 
    [OperationContract] 
    string GetData(int value); 

    [OperationContract] 
    CompositeType GetDataUsingDataContract(CompositeType composite); 

    [OperationContract] 
    [WebGet(BodyStyle = WebMessageBodyStyle.Bare, 
      RequestFormat = WebMessageFormat.Json, 
      ResponseFormat = WebMessageFormat.Json, 
      UriTemplate = "test/random")] 
    CompositeType GetTestData(); 
} 

[DataContract] 
public class CompositeType 
{ 
    [DataMember] 
    string _id; 
    public string Id 
    { 
     get { return _id; } 
     set { _id = value; } 
    } 

    [DataMember] 
    string _name = "Hello"; 
    public string Name 
    { 
     get { return _name; } 
     set { _name = value; } 
    } 

    [DataMember] 
    string _nameoffile = "Hello"; 
    public string NameOfFile 
    { 
     get { return _nameoffile; } 
     set { _nameoffile = value; } 
    } 
} 

Каков наилучший способ сделать это и как? Ваша помощь очень ценится!

Заранее спасибо.

ответ

2

WCF имеет не так много отличий:

[DataContract] 
public class sample 
{ 
    [DataMember] 
    public string Id { get; set; } 
    [DataMember] 
    public string Name { get; set; } 
    [DataMember] 
    public string NameOfFile { get; set; } 
} 

DataMember атрибуты не заданы по умолчанию, поэтому они обязательно каким-то образом.

[ServiceContract] 
public interface IGalleryWebService 
{ 

    [OperationContract] 
    sample[] Test(int count, float lat, float lng); 
} 

Кроме того, если вы используете basicHttpBinding и добавить ссылку с помощью «Добавить веб-ссылки» (вместо ссылки на службу) - вы получите тот же результат, как вы бы, если бы вы использовали ASMX службы.

+0

O.k, я реализовал это, но когда я положил его на свой веб-сервер IIS, он не работает. Это только когда я ставлю DataTable. Есть ли у вас какие-либо идеи по этому поводу? – tmutton

+0

Я получаю сообщение об ошибке. В IIS указаны схемы аутентификации «IntegratedWindowsAuthentication, Anonymous», но привязка поддерживает только одну схему аутентификации. Допустимые схемы аутентификации - это дайджест, переговоры, NTLM, базовый или анонимный. Измените параметры IIS, чтобы использовать только одну схему аутентификации. – tmutton

+0

Панель управления -> Администрирование -> IIS -> Выберите веб-сайт или приложение -> Дважды щелкните значок Authentificcation -> отключите встроенную аутентификацию Windows – vorrtex

Смежные вопросы