2

呼び出している WebHttpBinding WCF サービスがあります。最初の POST メソッドはオブジェクトを正しく送信しますが、その後の POST メソッドの呼び出しではオブジェクトに null が渡されます。

これが私のサービスです:

public void Update(ObjectDTO objectDTO)
{
  string token = WebOperationContext.Current != null ? WebOperationContext.Current.IncomingRequest.Headers["token"] : string.Empty;

  //Authentication
  bool isUserAuthenticatedResult = IsUserAuthenticated(ref token);
  if (!isUserAuthenticatedResult)
      return null;

  //Perform service action
  MyDtoManager = new MyDtoManager();
  objectDTO = MyDtoManager.Update(objectDTO); 
  return objectDTO;
}

これが私のサービス契約です:

[ServiceContract]
public interface IMyDtoService
{
    [OperationContract]
    [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
    List<ObjectDTO> LoadById(string value);

    [OperationContract]
    [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
    List<ObjectDTO> Load(string field, string value);

    [OperationContract]
    [WebInvoke(Method="GET", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
    List<ObjectDTO> LoadAll();

    [OperationContract(Name = "InsertSingle")]
    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
    ObjectDTO Insert(ObjectDTO objectDto);

    [OperationContract(Name = "UpdateSingle")]
    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
    ObjectDTO Update(ObjectDTO objectDto);

    [OperationContract(Name = "DeleteSingle")]
    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
    ObjectDTO Delete(ObjectDTO objectDto);
}

これが私のサーバー構成です:

<system.serviceModel>
  <bindings>
    <webHttpBinding>
      <binding name="WebHttpBindingConfig" 
           openTimeout="00:05:00" 
           sendTimeout="00:05:00"
           maxBufferSize="65536000" 
           maxBufferPoolSize="52428800" 
           maxReceivedMessageSize="65536000"
           transferMode="Buffered">
      <readerQuotas maxDepth="32" 
                  maxStringContentLength="65536000" 
                  maxArrayLength="16384" 
                  maxBytesPerRead="4096" 
                  maxNameTableCharCount="16384" />
      <security>
        <transport />
      </security>
    </binding>
  </webHttpBinding>
 </bindings>
 <services>
   <service behaviorConfiguration="Services.ServiceBehavior"
        name="Services.MyDtoService">
     <endpoint address="" 
          behaviorConfiguration="HttpBehavior" 
          binding="webHttpBinding" 
          name="Services.MyDtoService"
          contract="ServiceInterfaces.IMyDtoService">
     <identity>
        <dns value="localhost" />
     </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
 </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="Services.ServiceBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="HttpBehavior">
      <webHttp />
    </behavior>
  </endpointBehaviors>
</behaviors>
</system.serviceModel>

そして最後に、私のクライアントコードが呼び出しを行います:

IMyDtoService myDtoService = new WebChannelFactory<IMyDtoService>(BindingConfig, new Uri("http://localhost:8080/MyDtoService.svc")).CreateChannel();
using (new OperationContextScope((IClientChannel)myDtoService))
{
    if (WebOperationContext.Current != null)
        WebOperationContext.Current.OutgoingRequest.Headers.Add("token", tokenResult.Result);

    ObjectDTO insertResult = ipAddressService.Insert(new ObjectDTO
                                              { ObjectGuid = Guid.NewGuid(),
                                                IsAllow = true,
                                                Identifier = 1,
                                                IdentifierType = 0,
                                                StartIpAddress = "192.168.0.1"
                                              });
    List<ObjectDTO> loadByIdResult1 = myDtoService.LoadById(insertResult.ObjectGuid.ToString());
    Console.WriteLine("Insert Found: " + loadByIdResult1.Count);

    insertResult.IsAllow = false;
    ObjectDTO updateResult = ipAddressService.Update(insertResult);
}

ご覧のとおり、クライアント コードが WCF サービスを呼び出し、insert メソッドは問題なく動作し、データベースに永続化されたオブジェクトが表示されます。ただし、更新時に、ObjectDTO パラメーターは null です。既存のオブジェクトをロードして更新を実行すると、完全に機能します。これは、POST メソッドを使用した WCF サービスへの後続の呼び出しに問題があるようです。GET メソッドではこの問題はありません。

4

2 に答える 2

2

私はこの問題を経験しましたが、WCF SOAP. クライアント サイトでは、デバッグ ポイントがサービスに入ったときに値で満たされたオブジェクトを確認できます。これは null です。これは、param の大文字と小文字の変更が原因で発生していました。. サービス契約が

ObjectDTO Update(ObjectDTO objectDto );

定義には public void Update(ObjectDTO objectDTO ) があります。大文字と小文字の違いに注意してください。

于 2013-02-02T06:53:02.400 に答える
1

関連するコードが問題の原因を 100% 確実に示していません。しかし、次の行のため、null のように見えます。

ObjectDTO insertResult = ipAddressService.Insert(new ObjectDTO 
                                              { ObjectGuid = Guid.NewGuid(), 
                                                IsAllow = true, 
                                                Identifier = 1, 
                                                IdentifierType = 0, 
                                                StartIpAddress = "192.168.0.1" 
                                              }); 

nullを返しています。したがって、挿入方法を確認する必要があります。

于 2010-02-13T14:02:28.937 に答える