2016-11-10 10 views
0

私は基本的にSQL DBに接続し、データを収集し、リスト内のデータを呼び出し元に返します。しかし、私のクライアント(呼び出し元)はnullデータを取得しますが、wcfコードをステップ実行するとデータを返します。WCFサービスコールはデータを返しますがレシーバはnullを返します

ここにwcfサービスを呼び出すクライアントコードがあります。彼らは(はい、クライアントがVBであるべきではないとき、私はブレークポイントを設定するとき、それは、ここにあることに注意して呼び出しが戻った後

GetServerUpdatesSyncOthers

を見て、私のリストは、すべてNULLです。レコードのネットが、WCFサービスは、C#である)

Dim svc As PocketPCServerClient = GetServiceClient() 

    Dim updates As ServerUpdatesSyncDTO = svc.GetServerUpdatesSyncOthers(myDeviceId, timestamps.ToArray, operatorName, Me.IdMethodName(idMethod), idMethodValue, destinationHub, withLocationGroup) 

は、ServerUpdatesSyncDTOは、クライアント側で次のようになります。

<DataContract()> 
Public Class ServerUpdatesSyncDTO 
Public Const EMPLOYEES_PROCESS_MAXIMUM_NONE As Integer = 0 
Public Const EMPLOYEES_PROCESS_MAXIMUM_ALL As Integer = -1 

<DataMember()> 
Public Property SystemDateTimeUtc As DateTime 
<DataMember()> 
Public Property SyncTimestamps As List(Of SyncTimestampDTO) 
<DataMember()> 
Public Property DeviceSettings As List(Of DeviceSettingDTO) 
<DataMember()> 
Public Property Couriers As List(Of CourierDTO) 
<DataMember()> 
Public Property Validation As List(Of ValidationDTO) 
<DataMember()> 
Public Property NameVariants As List(Of String) 
<DataMember()> 
Public Property NameScrubs As List(Of String) 
<DataMember()> 
Public Property Notes As List(Of String) 
<DataMember()> 
Public Property Notifications As List(Of NotifyDTO) 
<DataMember()> 
Public Property Locations As List(Of LocationDTO) 
<DataMember()> 
Public Property UpsValids As List(Of UpsValidDTO) 
<DataMember()> 
Public Property StatusCodes As List(Of StatusCodeDTO) 
<DataMember()> 
Public Property HubRecon As List(Of String) 
<DataMember()> 
Public Property HubNames As List(Of String) 
<DataMember()> 
Public Property ExtCustomFieldNames As CustomFieldHeadersDTO 
<DataMember()> 
Public Property HoldPickupLocations As List(Of HoldPickupDTO) 
<DataMember()> 
Public Property EmployeeUpdates As List(Of EmployeeDTO) 
<DataMember()> 
Public Property EmployeeInserts As List(Of EmployeeDTO) 
<DataMember()> 
Public Property EmployeeDeletes As List(Of EmployeeDTO) 
<DataMember()> 
Public Property EmployeesProcessMore As Boolean 
<DataMember()> 
Public Property EmployeesProcessMoreIdGreaterThan As String 
End Class 

そして、WCFサービス側では、ServerUpdatesSyncDTOのC#バージョン:

[DataContract] 
public class ServerUpdatesSyncDTO 
{ 
    public const int EMPLOYEES_PROCESS_MAXIMUM_NONE = 0; 
    public const int EMPLOYEES_PROCESS_MAXIMUM_ALL = -1; 

     [DataMember] 
     public DateTime SystemDateTimeUtc { get; set; } 
     [DataMember] 
     public List<SyncTimestampDTO> SyncTimestamps { get; set; } 
     [DataMember] 
     public List<DeviceSettingDTO> DeviceSettings { get; set; } 
     [DataMember] 
     public List<CourierDTO> Couriers { get; set; } 
     [DataMember] 
     public List<ValidationDTO> Validation { get; set; } 
     [DataMember] 
     public List<string> NameVariants { get; set; } 
     [DataMember] 
     public List<string> NameScrubs { get; set; } 
     [DataMember] 
     public List<string> Notes { get; set; } 
     [DataMember] 
     public List<NotifyDTO> Notifications { get; set; } 
     [DataMember] 
     public List<LocationDTO> Locations { get; set; } 
     [DataMember] 
     public List<UpsValidDTO> UpsValids { get; set; } 
     [DataMember] 
     public List<StatusCodeDTO> StatusCodes { get; set; } 
     [DataMember] 
     public List<EmployeeDTO> EmployeeUpdates { get; set; } 
     [DataMember] 
     public List<EmployeeDTO> EmployeeInserts { get; set; } 
     [DataMember] 
     public List<EmployeeDTO> EmployeeDeletes { get; set; } 
     [DataMember] 
     public bool EmployeesProcessMore { get; set; } 
     [DataMember] 
     public string EmployeesProcessMoreIdGreaterThan { get; set; } 
     [DataMember] 
     public List<string> HubRecon { get; set; } 
     [DataMember] 
     public List<string> HubNames { get; set; } 
     [DataMember] 
     public CustomFieldHeadersDTO ExtCustomFieldNames { get; set; } 
     [DataMember] 
     public List<HoldPickupDTO> HoldPickupLocations { get; set; } 
    } 

最後に、クライアントによって呼び出されるWCFサービス方法。ここではブレークポイントを設定してステップを進めることができます。このメソッドは有効なデータを返しますが、例外はありません。たとえば、アイテムの1つ、宅配便のリスト。私は返すときwcf側の私のリストにそれらの48がありますが、呼び出しが返された後にクライアントが "更新"のCourierにnullを表示します。

public ServerUpdatesSyncDTO GetServerUpdatesSyncOthers(string deviceId, List<SyncTimestampDTO> syncTimestamps, string operatorName, string locationCriteriaType, string locationCriteria, string destinationHub, bool withLocationGroup) 
    { 
     var thisMethodName = MethodBase.GetCurrentMethod().Name; 
     CurrentTaskName = thisMethodName; 
     CurrentDeviceId = deviceId; 

     if (string.IsNullOrWhiteSpace(deviceId)) 
      throw new FaultException(string.Format("Argument null [{0}]", "deviceId")); 
     if (syncTimestamps == null) 
      throw new FaultException(string.Format("Argument null [{0}]", "syncTimestamps")); 
     if (string.IsNullOrWhiteSpace(operatorName)) 
      throw new FaultException(string.Format("Argument null [{0}]", "operatorName")); 
     if (locationCriteriaType.ToUpper() != LOCATION_ID_METHOD_BY_EMPLOYEE && locationCriteriaType.ToUpper() != LOCATION_ID_METHOD_BY_NAME) 
      throw new FaultException(string.Format("locationCriteriaType [{0}] is invalid. Valid values are {1} or {2}", locationCriteriaType, LOCATION_ID_METHOD_BY_EMPLOYEE, LOCATION_ID_METHOD_BY_NAME)); 
     if (string.IsNullOrWhiteSpace(locationCriteria) & locationCriteriaType != LOCATION_ID_METHOD_BY_EMPLOYEE) 
      throw new FaultException(string.Format("Argument null [{0}]", "locationCriteria")); 

     var result = new ServerUpdatesSyncDTO(); 

     try 
     { 
      WriteServerLog(SERVER_TASK_BEGIN); 
      using (var conn = GetSQLConnection()) 
      { 
       var homeLocationCode = 0; 
       var loginLocationCode = 0; 
       List<int> groupLocationCodes; 

       if ((locationCriteriaType == LOCATION_ID_METHOD_BY_EMPLOYEE) && (string.IsNullOrWhiteSpace(locationCriteria))) 
       { 
        locationCriteria = operatorName; 
       } 

       loginLocationCode = GetLocationCode(conn, null, locationCriteriaType, locationCriteria); 
       groupLocationCodes = GetGroupLocationCodes(conn, null, loginLocationCode); 

       if (locationCriteriaType == LOCATION_ID_METHOD_BY_EMPLOYEE) 
       { 
        homeLocationCode = loginLocationCode; 
       } 
       else 
       { 
        homeLocationCode = GetLocationCode(conn, null, LOCATION_ID_METHOD_BY_EMPLOYEE, operatorName); 
       } 

       var lastUpdateUtc = GetLocationSyncDateTimeUtc(loginLocationCode, syncTimestamps); 
       result.Couriers = GetCourierUpdates(conn, lastUpdateUtc, loginLocationCode); 
       result.Validation = GetValidationUpdates(conn, lastUpdateUtc, loginLocationCode); 
       result.HubNames = GetHubNames(conn, lastUpdateUtc, loginLocationCode); 

       result.NameVariants = GetNameVariantUpdates(conn, lastUpdateUtc); 
       result.NameScrubs = GetNameScrubUpdates(conn, lastUpdateUtc); 
       result.Notes = GetNotesUpdates(conn, loginLocationCode); 
       result.Notifications = GetNotifyUpdates(conn, lastUpdateUtc); 
       result.Locations = GetLocationUpdates(conn, lastUpdateUtc); 
       result.UpsValids = GetUpsValidUpdates(conn, lastUpdateUtc); 
       result.StatusCodes = GetStatusCodeUpdates(conn, lastUpdateUtc); 
       result.ExtCustomFieldNames = GetExtendedCustomFieldHeaderUpdates(conn, lastUpdateUtc); 

       if (Properties.Settings.Default.HoldForPickupUpdates) 
       { 
        result.HoldPickupLocations = GetHoldPickupUpdates(conn); 
       } 
       else 
       { 
        result.HoldPickupLocations = new List<HoldPickupDTO>(); 
       } 

       if (!string.IsNullOrWhiteSpace(destinationHub)) 
       { 
        result.HubRecon = GetHubReconUpdates(conn, destinationHub); 
       } 
       else 
       { 
        result.HubRecon = new List<string>(); 
       } 

       result.DeviceSettings = GetDeviceSettingUpdates(conn, loginLocationCode, deviceId); 

       result.SystemDateTimeUtc = DateTime.Now.ToUniversalTime(); 
       result.SyncTimestamps = GetSyncTimestampUpdates(result.SystemDateTimeUtc, syncTimestamps, loginLocationCode, groupLocationCodes, withLocationGroup); 

      } 

      WriteServerLog(SERVER_TASK_COMPLETE, true, true); 
      return result; 

     } 
     catch (FaultException ex) 
     { 
      throw ex; 
     } 
     catch (Exception ex) 
     { 
      string exText = FormatException(ex, string.Format("{0}:{1}", Assembly.GetExecutingAssembly().GetName().Name, thisMethodName)); 
      WriteServerLog(thisMethodName, ServerLogDTO.LogTypeEnum.Critical, exText, ServerLogDTO.EventDataFormatEnum.MultilineText); 
      throw new FaultException(exText); 
     } 
    } 

だから、私は、クライアントが、VBであるために、それは大丈夫でなければなりませんし、サービスをWCFされる一方で、それはデータが返されるときVbが好きではないのミスマッチのいくつかの並べ替えがなければならないと仮定しますか?私はそれを見ない。データ型はすべて同じで、両方ともリストです。

ありがとうございました!

+0

私のお勧めは、いくつかのサンプルデータを作成し、あなたのvb datacontractを使用してxmlにシリアル化することです。同じデータをとり、C#datacontractを使ってxmlにシリアライズしてください。diffツールを使い、XMLを比較してください。違いがある場合は、契約を変更して同じものにする必要があります – Mick

+0

また、datacontract用のクラスライブラリを作成せず、datacontractを複製する代わりにクライアントでそのアセンブリを参照した理由は何ですか? – Mick

+0

ミック、提案のおかげで、完璧な意味が、今それを試してみましょう。私はこのような何かを仮定するhttp://stackoverflow.com/questions/11142280/how-to-serialize-deserialize-ac-sharp-wcf-datacontract-to-from-xml –

答えて

0

問題が見つかりました。通常、クライアントはサービスからWSDLをプルダウンしてクライアントクラスを作成できるwcfサービスを持つサービス参照を持っています。これは、[参照設定]> [サービス参照の追加]に移動し、Webサービスアドレスをポイントすることで行います。

これには2つの注意点がありますが、どちらも私の問題でした。 1.サービス参照を右クリックして更新を行うことができます。これにより、サービス参照がプルダウンされ、更新されます。このサービスを参照するクライアントが更新されるように、WCFサービスが変更された場合はこれが必須です。それ以外の場合は、インターフェイスが異なり、物事はうまく動作しません。 2.サービス参照を追加または編集するときに、使用するコレクションの種類を選択するオプションがあります。デフォルトでは、私のものが配列として選択されていました。しかし、WCFサービスでは、配列は使用せず、リストを使用しました。サービス参照/クライアントコードとの不一致がある場合、コレクションは破損します。サービス参照を更新した場合は警告が表示されますが、私の場合はサービス参照を更新していませんでした。

したがって、私は私のサービス参照を更新した後、私もリストを使用していて、配列ではないことを選択しました。その後、すべてが期待通りに機能します。

これが役に立ちます。

関連する問題