2012-03-05 6 views
0

WCFを使用しようとしているという問題が発生しています他のRESTfulサービスを呼び出すサービス。WCFサービス - jsonを使用してrestにアクセスするクライアントを呼び出すときに正しいコンテンツタイプが指定されていない

ただし、これをトレースすると、正しいjsonコンテンツタイプをメッセージに配置できません。

クライアントでのコールの例(これはコードを呼び出すWCFサービスの範囲内である)

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
[ServiceBehavior()] 
public partial class MyRestServiceClient : System.ServiceModel.ClientBase<IMyRestService>, IMyRestService 
{ 
    [WebInvoke(Method = "POST", UriTemplate = "/MyService/ReferenceTypes.json", RequestFormat = WebMessageFormat.Json)] 
    public MyServiceLists GetReferenceTypes() 
    { 
     try 
     { 
      return base.Channel.GetReferenceTypes(); 
     } 
     catch (Exception e) 
     { 
      throw e; //throws exception here - method not allowed 
     } 
    } 
} 

の代わりに、それは呼び出しに代わりアプリケーション/ XMLを置くアプリケーション/ JSONのコンテンツタイプを置きます。これは、呼び出しを行っているWCFサービスに配置されたアクティビティトレースから実行されました。アクティビティログからの情報「送信されたメッセージ」の 例:私はクライアントのためにwebHttpBindingを使用している

<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent"> 
<System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system"> 
<EventID>262164</EventID> 
<Type>3</Type> 
<SubType Name="Information">0</SubType> 
<Level>8</Level> 
<TimeCreated SystemTime="2012-03-05T12:26:52.8913972Z" /> 
<Source Name="System.ServiceModel" /> 
<Correlation ActivityID="{7759c13c-972d-46a2-8048-2dcaf1c066bf}" /> 
<Execution ProcessName="aspnet_wp" ProcessID="2408" ThreadID="11" /> 
<Channel /> 
<Computer>Z1020734</Computer> 
</System> 
<ApplicationData> 
<TraceData> 
<DataItem> 
<TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Information"> 
<TraceIdentifier>http://msdn.microsoft.com/en-GB/library/System.ServiceModel.Channels.MessageSent.aspx</TraceIdentifier> 
<Description>Sent a message over a channel.</Description> 
<AppDomain>/LM/w3svc/1/ROOT/My.Services-2-129754240054859056</AppDomain> 
<Source>System.ServiceModel.Channels.HttpOutput+WebRequestHttpOutput/18905726</Source> 
<ExtendedData xmlns="http://schemas.microsoft.com/2006/08/ServiceModel/MessageTraceRecord"> 
<MessageProperties> 
**<Encoder>application/xml; charset=utf-8</Encoder>** 
<AllowOutputBatching>False</AllowOutputBatching> 
<Via>http://mymachine/My.services.stub.REST/</Via> 
</MessageProperties> 
<MessageHeaders></MessageHeaders> 
</ExtendedData> 
</TraceRecord> 
</DataItem> 
</TraceData> 
</ApplicationData> 
</E2ETraceEvent> 

は、その後、私はまた、JSONを強制的にカスタムWebコンテンツ・タイプ・マッパーを使用してカスタムバインディング同等を試してみましたコンテンツタイプは無駄になります。

クライアントエンドポイントは、同じマシン上でRest(Rest 40テンプレートを使用して)Restfulサービスを指しています。

<?xml version="1.0"?> 
<configuration> 
    <connectionStrings> 
    </connectionStrings> 
    <appSettings> 
    </appSettings> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 
    <system.serviceModel> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/> 
    <services> 
     <service name="My.Services.MyService" behaviorConfiguration="My.Services.MyServiceBehavior" > 
     <endpoint address="" binding="customBinding" bindingConfiguration="CustomBinding_IMyService" contract="My.Common.ServiceContracts.IMyService"/> 
     </service> 
     <service name="My.Services.SomeOtherService" behaviorConfiguration="My.Services.SomeOtherBehavior" > 
     <endpoint address="" binding="customBinding" bindingConfiguration="customBinding_ISomeOtherService" contract="My.Common.ServiceContracts.ISomeOtherService"/> 
     </service> 
    </services> 
    <bindings> 
     <webHttpBinding> 
     <binding name="webHttpCustomBinding"> 
      <security mode="TransportCredentialOnly"> 
      <transport proxyCredentialType="None" clientCredentialType="Windows"> 
      </transport> 
      </security> 
     </binding> 
     </webHttpBinding> 

     <customBinding> 
     <binding name ="CustomBinding_IIMyRestService"> 
      <webMessageEncoding webContentTypeMapperType="My.Common.ServiceModel.JsonContentTypeMapper, My.Common" ></webMessageEncoding> 
      <httpTransport authenticationScheme="Negotiate" ></httpTransport> 
     </binding> 
     <binding name="CustomBinding_IMyService"> 
      <textMessageEncoding messageVersion="Soap12" /> 
      <httpTransport maxBufferPoolSize="1000000" maxReceivedMessageSize="1000000" 
      authenticationScheme="Negotiate" maxBufferSize="1000000" /> 
     </binding> 
     <binding name="customBinding_ISomeOtherService"> 
      <textMessageEncoding messageVersion="Soap12" /> 
      <httpTransport /> 
     </binding> 
     </customBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://MyMachine/My.services.stub.REST/" binding="customBinding" bindingConfiguration="CustomBinding_IMyRestService" name="RestService" contract="My.Common.ServiceContracts.IIMyRestService" behaviorConfiguration="webhttp"/> 
</client> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="webhttp"> 
     </behavior> 
</endpointBehaviors> 
     <serviceBehaviors> 
     <behavior name="My.Services.MyServiceBehavior"> 
      <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     <behavior name="My.Services.SomeOtherServiceBehavior"> 
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
    <system.net> 
    <defaultProxy useDefaultCredentials="true"/> 
    </system.net> 
<system.diagnostics> 
    <trace autoflush="true"/> 
    <sources> 
     <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true"> 
     <listeners> 
      <add name="sdt" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:\temp\my.Services.svclog"/> 
     </listeners> 
     </source> 
    </sources> 
    </system.diagnostics> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
</configuration> 

注: は、RESTエンドポイントを呼び出すようにしようとしているWCFサービスのweb.configファイルは下記を参照してください私は、同じ機能と設定を書いたコンソールアプリが正常に動作していて、正しいを与えますコンテンツタイプ。

ご迷惑をおかけして申し訳ございません。

答えて

2

まだ解決していないかどうかはわかりませんが、同じ問題が発生しました。
既存のサービス呼び出し内からサービスを呼び出す場合、新しい呼び出しを新しいOperationContextScopeにラップする必要があります。

あなたがここで詳細を見ることができます:WCF Rest Client sending incorrect content-type

+0

感謝を見るために - 私は最終的にこれを解決手に入れた、私たちのプロキシが邪魔になっていた道に降りました。私たちは必要な資格情報を指定したカスタムプロキシを使用しました(私が正しく覚えていれば)。これは私たちの生産システムの問題ではありませんでした。 – williamfalconeruk

関連する問題