2017-01-28 74 views
0

我的問題如何更改SOAP XML中的ArrayOfResponse元素WCF服務 使用Message類....請參閱圖片我想更改紅色框中的元素... 任何想法???如何更改Soap XML元素名稱'ArrayOfResponse'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); 
} 

...或者只是嘗試使用List作爲回報,忘記EvaluationList。

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

現在,EvaluationList和EvaluationRequest都是MessageContracts。

請記住,如果您想完全控制SOAP消息,您只需要使用MessageContract。這似乎並非如此。

所以,更容易的辦法是,改變你的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會將此視爲安全缺陷。

所以定義BOTH類,導致參數,如DataContract OR MessageContract,但不要混合起來。