2017-01-28 2 views
0

Моя проблема Как изменить элемент ArrayOfResponse в SOAP-XML WCF-сервисах с использованием класса сообщений .... см. Изображение Я хочу изменить элемент в красном поле ... любые идеи ???Как изменить имя элемента «ArrayOfResponse» в Soap XML WCF-сервисы

enter image description here

, что мой код, чтобы получить этот результат!

моего интерфейс

[ServiceContract()] 
    public interface IEvaluationWebService 
    { 
     [OperationContract(ReplyAction = "Evaluations")] 
     Message GetEvaluations(EvaluationRequest evaluationRequest); 
    } 

этот метод задание один параметр EvaluationRequest класс, чтобы вернуть сообщение (Список класса оценки)

Message IEvaluationWebService.GetEvaluations(EvaluationRequest evaluationRequest) 
    { 
     SqlConnection cnn = new SqlConnection(""); 

     DateTime dtstart = new DateTime(); 
     DateTime.TryParseExact(evaluationRequest.PeriodStart, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.NoCurrentDateDefault, out dtstart); 
     evaluationRequest.PeriodStart = dtstart.ToString("yyyy-MM-dd"); 

     DateTime dtend = new DateTime(); 
     DateTime.TryParseExact(evaluationRequest.PeriodEnd, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.NoCurrentDateDefault, out dtend); 
     evaluationRequest.PeriodEnd = dtend.ToString("yyyy-MM-dd"); 

     SqlCommand cmd = new SqlCommand("GetEmployeeEvaluation", cnn); 
     cmd.CommandType = CommandType.StoredProcedure; 

     cmd.Parameters.Add("@PeriodStart", SqlDbType.VarChar, 10).Value = evaluationRequest.PeriodStart; 
     cmd.Parameters.Add("@PeriodEnd", SqlDbType.VarChar, 10).Value = evaluationRequest.PeriodEnd; 

     cnn.Open(); 
     SqlDataReader sdr = cmd.ExecuteReader(); 

     List<Evaluation> evaluationList = new List<Evaluation>(); 

     MessageVersion ver = OperationContext.Current.IncomingMessageVersion; 
     while (sdr.Read()) 
     { 
      Evaluation evaluation = new Evaluation(); 
      evaluation.EstLaborOfficeId = Convert.ToInt32(sdr["EstLaborOfficeId"].ToString()); 
      evaluation.EstSequenceNumber = Convert.ToInt32(sdr["EstSequenceNumber"].ToString()); 
      evaluation.IdNumber = 
      evaluationList.Add(evaluation); 
     } 
     Evaluation eval = new Evaluation(); 
     cnn.Close(); 
     return Message.CreateMessage(ver, "Evaluations", evaluationList); 
    } 

Класса запроса пропускания даты для метода и получают данные. ...

 [MessageContract(IsWrapped = true, WrapperName = "GetEvaluation", WrapperNamespace = "http://tempuri.org/")] 
[XmlType(Namespace = "http://tempuri.org/")] 
public class EvaluationRequest 
{ 
    [MessageBodyMember(Order = 1)] 
    public string PeriodStart { get; set; } 

    [MessageBodyMember(Order = 2)] 
    public string PeriodEnd { get; set; } 
} 

класс запроса (параметры для GetEval uations метод)

 [MessageContract(IsWrapped = true, WrapperName = "GetEvaluation", WrapperNamespace = "http://tempuri.org/")] 
[XmlType(Namespace = "http://tempuri.org/")] 
public class EvaluationRequest 
{ 
    [MessageBodyMember(Order = 1)] 
    public string PeriodStart { get; set; } 

    [MessageBodyMember(Order = 2)] 
    public string PeriodEnd { get; set; } 
} 

Оценка класса

 [DataContract()] 
    public class Evaluation 
    { 
     private int _EstLaborOfficeId; 
     private int _EstSequenceNumber; 
     private long _IdNumber; 

     [DataMember] 
     public int EstLaborOfficeId 
     { 
      get { return _EstLaborOfficeId; } 
      set { _EstLaborOfficeId = value; } 
     } 

     [DataMember(Order = 2)] 
     public int EstSequenceNumber 
     { 
      get { return _EstSequenceNumber; } 
      set { _EstSequenceNumber = value; } 
     } 
} 

ответ

0

Любой, кто хочет потреблять вашу службу, не знает, какой результат он будет reveice. Это просто «Сообщение» и не имеет специального MessageContract.

Насколько я вижу, вы хотите вернуть список оценок.

Что вы могли бы попробовать это: (непроверенная)

[MessageContract] 
public class Evaluation 
{ 
    private int _EstLaborOfficeId; 
    private int _EstSequenceNumber; 
    private long _IdNumber; 

    [MessageBodyMember] 
    public int EstLaborOfficeId 
    { 
     get { return _EstLaborOfficeId; } 
     set { _EstLaborOfficeId = value; } 
    } 

    [MessageBodyMember] 
    public int EstSequenceNumber 
    { 
     get { return _EstSequenceNumber; } 
     set { _EstSequenceNumber = value; } 
    } 
} 



[MessageContract] 
public class EvaluationList 
{ 
    [MessageBodyMember] 
    public List<Evaluation> Values {get;set} 
} 


[ServiceContract()] 
public interface IEvaluationWebService 
{ 
    [OperationContract] 
    EvaluationList GetEvaluations(EvaluationRequest evaluationRequest); 
} 

... или просто попробуйте использовать список, как вернуться и забыть EvaluationList.

[ServiceContract()] 
public interface IEvaluationWebService 
{ 
    [OperationContract] 
    List<Evaluation> GetEvaluations(EvaluationRequest evaluationRequest); 
} 

Now, EvaluationList и EvaluationRequest являются MessageContracts.

Пожалуйста, имейте в виду, что вы ТОЛЬКО хотите использовать MessageContract, если хотите полностью управлять SOAP-сообщением. Кажется, это не так.

Таким образом, более легкий путь будет, чтобы изменить EvaluationRequest обратно DataContract:

[DataContract()] 
public class Evaluation 
{ 
    private int _EstLaborOfficeId; 
    private int _EstSequenceNumber; 
    private long _IdNumber; 

    [DataMember] 
    public int EstLaborOfficeId 
    { 
     get { return _EstLaborOfficeId; } 
     set { _EstLaborOfficeId = value; } 
    } 

    [DataMember(Order = 2)] 
    public int EstSequenceNumber 
    { 
     get { return _EstSequenceNumber; } 
     set { _EstSequenceNumber = value; } 
    } 
} 

[DataContract] 
public class EvaluationRequest 
{ 
    [DataMember] 
    public string PeriodStart { get; set; } 

    [DataMember] 
    public string PeriodEnd { get; set; } 
} 

[ServiceContract()] 
public interface IEvaluationWebService 
{ 
    [OperationContract] 
    List<Evaluation> GetEvaluations(EvaluationRequest evaluationRequest); 
} 

Золотое правило: Старайтесь не смешивать DataContract и MessageContract в операции службы, так как WCF увидит это как недостаток безопасности.

Так определяет ОБА классов, результат И параметра, как DataContract ИЛИ MessageContract, но не смешивать его.

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