8

私は現在、Entity FrameworkでWCF Data Services(まあ、ADO.Net Data Services)を使用しており、POSTを実行すると次のエラーが発生します(無関係な情報を省略/変更しました):

<?xml version="1.0" encoding="utf-8"?><m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"><m:code /><m:message xml:lang="en-GB">The URI 'http://localhost:56568/MyWcfDataServices.svc/EntitySetName(pk_id)' is not valid for POST operation. For POST operations, the URI must refer to a service operation or an entity set.</m:message></m:error>

オンラインで調べてみると、このメッセージに関する多くの情報が見つからないため、デバッグが少し困難です。私が投稿している属性の 1 つが大きな base64 文字列であるため、これが発生している可能性があります (これを投稿しなくても問題なく動作します)。を次のように設定してみましmaxRequestLengthた:

<httpRuntime maxRequestLength="102400" />

しかし、それは役に立たなかったようです。私はこれに取り組み続けますが、ここに簡単な投稿をして、誰かが何かを知っているかどうかを確認したいと思いました.

私の WCF Data Service クラスは次のようになります。

public class MyWcfDataServices: DataService<ContextName>
{
    public static void InitializeService(DataServiceConfiguration config)
    {
        // set entity access rules etc
    }
}

ありがとう

編集:これでどこにも行けないようです。これが私がこれまでに試したことです。

サーバー側では、次のバインディングを設定しました。

<system.serviceModel>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" 
                             minFreeMemoryPercentageToActivateService="0" />
  <services>
    <service name="MyWcfDataServices" 
             behaviorConfiguration="myBehaviorConfig">
      <endpoint address=""
                binding="webHttpBinding"
                bindingConfiguration=""
                contract="System.Data.Services.IRequestHandler" />
    </service>
  </services>
  <behaviors>
    <serviceBehaviors>
      <behavior name="myBehaviorConfig">
        <serviceMetadata httpGetEnabled="true"/>
        <serviceDebug includeExceptionDetailInFaults="true"/>
        <dataContractSerializer maxItemsInObjectGraph="2147483647" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

maxItemsInObjectGraph属性が解決策になることを願っています。これらのバインディングは正しく見えますか? サーバーにより多くのデータを POST できるようにする属性が不足していますか? クライアントでもこのサービスの動作を構成する必要がありますか?

4

3 に答える 3

18

OK、これが問題を解決するために私がしたことです。最初に、web.config に以下を追加して、サーバーでトレースを有効にしました。

<system.diagnostics>
  <sources>
    <source name="System.ServiceModel"
            switchValue="Information, ActivityTracing"
            propagateActivity="true">
      <listeners>
        <add name="traceListener"
            type="System.Diagnostics.XmlWriterTraceListener"
            initializeData="c:\logs\Traces.svclog"  />
      </listeners>
    </source>
  </sources>
</system.diagnostics>

これにより、問題に関するより多くの情報が得られました。特に、私の場合、最大リクエスト長はまだ65536であり、バインディングが取得されていないことを示していました。これには 2 つの問題がありました。まず、構成のname一部がservice正しくありませんでした。名前空間情報を含める必要がありました。私はこれで終わりました(これをクライアントのweb.configにも入れなければなりませんでした):

<services>
  <service name="Solution.Project.MyWcfDataServices">
    <endpoint address=""
              binding="webHttpBinding"
              bindingConfiguration="webHttpConfig"
              contract="System.Data.Services.IRequestHandler" />
  </service>
</services>
<bindings>
  <webHttpBinding>
    <binding name="webHttpConfig" 
              allowCookies="true"
              maxReceivedMessageSize="20000000"
              maxBufferSize="20000000"
              maxBufferPoolSize="20000000">
      <readerQuotas maxDepth="32"
                    maxArrayLength="200000000"
                    maxStringContentLength="200000000" />
    </binding>
  </webHttpBinding>
</bindings>

最後に、.svc ファイルのマークアップの factory を、テンプレートで生成されたSystem.Data.Servicesアセンブリから Microsoft の ODATA アセンブリ (System.Data.Services 名前空間も含む)に変更する必要がありSystem.Data.Services.DataServiceHostFactory, Microsoft.Data.Services, Version=5.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35ました。

始めたときよりも髪が少なくなりましたが、それはあなたが支払う代償だと思います.

于 2013-01-21T14:56:59.580 に答える
7

DataContract の一部の DataMembers に get メソッドしかないため、この問題が発生していました。例えば

[DataMember]
public Name { get; } 

このエラーが発生します。あなたが持つべき問題を解決するには

[DataMember]
public Name {get; set;}
于 2016-12-06T10:50:48.890 に答える