3

私はこのWCFサービスを持っています:

IService.cs:

public interface IService
{
   [OperationContract]
   [WebInvoke(Method = "POST", UriTemplate = "/PostComments", BodyStyle = WebMessageBodyStyle.Wrapped,
    RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
   string PostComments(PostComment comment);

 [DataContract]
public class PostComment
{
    private string Id;
    private string FullName;
    private string Email;
    private string Location;
    private string Comments;
    private string Type;

    [DataMember]
    public string id { get { return Id; } set { Id = value; } }
    [DataMember]
    public string fullname { get { return FullName; } set { FullName = value; } }
    [DataMember]
    public string email { get { return Email; } set { Email = value; } }
    [DataMember]
    public string location { get { return Location; } set { Location = value; } }
    [DataMember]
    public string comments { get { return Comments; } set { Comments = value; } }
    [DataMember]
    public string type { get { return Type; } set { Type = value; } }
}

Service.svc.cs:

public string PostComments(PostComment commnt)
        {
            int ItemId;
            string Comments, FullName, Location, Email, Type;

            ItemId = Convert.ToInt32(commnt.id);
            Type = commnt.type;
            Comments = commnt.comments;
            FullName = commnt.fullname;
            Location = commnt.location;
            Email = commnt.email;
            int i = 0;

            if (Type == "Style")
            {
                adp = new SqlDataAdapter("insert into tblComment(intId,strComments,strFullName,strLocation,strEmail,dtPosted,blnApprove) values("+ItemId+",'"+Comments+"','"+FullName+"','"+Location+"','"+Email+"',GetDate(),1)", offcon);
                adp.Fill(ds1,"StComment");
                DataTable dt = ds1.Tables["StComment"];
                i++;
            }
            else if (Type == "Article")
            {
                adp = new SqlDataAdapter("insert into tblNewsComment(intArticleId,strComments,strFullName,strLocation,strEmail,dtPosted,blnApprove) values(" + ItemId + ",'" + Comments + "','" + FullName + "','" + Location + "','" + Email + "',GetDate(),1)", offcon);
                adp.Fill(ds1, "ArtComment");
                DataTable dt = ds1.Tables["ArtComment"];
                i++;
            }
            if (i > 0)
            {
                return "Comment Successfully Submitted.";
            }
            else
            {
                return "Comment falied to Submit.";
            }
        }

web.configファイル:

<?xml version="1.0"?>
<configuration>
<connectionStrings>
  <add name="con" connectionString="Data Source=.;Initial Catalog=PatrikaData;Integrated Security=SSPI;"/>  
</connectionStrings>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime requestPathInvalidCharacters="&lt;,&gt;,*,%,:,\"/>
  </system.web>
  <system.serviceModel>
    <services>
      <service behaviorConfiguration="ServiceBehaviour" name="WcfService.Service">
        <endpoint address="" behaviorConfiguration="web" binding="webHttpBinding"
          contract="WcfService.IService" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehaviour">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="web">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment/>
    <bindings>
      <webHttpBinding>
        <binding name="web"
                 maxBufferPoolSize="1500000"
                 maxReceivedMessageSize="1500000"
                 maxBufferSize="1500000">
          <readerQuotas
                maxArrayLength="656000"
                maxBytesPerRead="656000"
                maxDepth="32"
                maxNameTableCharCount="656000"
                maxStringContentLength="656000"
            />
        </binding>
      </webHttpBinding>
    </bindings>
  </system.serviceModel>  
</configuration>

現在、 WCF テスト クライアントBasicHttpBindingを使用してテストしている場合は、すべて正常に動作しています。

しかし、Google の Advanced Rest ClientWebHttpBindingを使用してテストし、それを介してデータを投稿すると、次のエラーが発生します

サーバーでリクエストの処理中にエラーが発生しました。例外メッセージは、「メッセージのデシリアライズ中にフォーマッタが例外をスローしました: 操作 'PostComments' のリクエスト メッセージのボディをデシリアライズ中にエラーが発生しました。予期しない文字「T」に遭遇しました。詳細については、サーバー ログを参照してください。例外スタック トレースは次のとおりです。

System.ServiceModel.Dispatcher.OperationFormatter.DeserializeRequest (メッセージ メッセージ、オブジェクト [] パラメーター) で System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest (メッセージ メッセージ、オブジェクト [] パラメーター) で System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequest (メッセージSystem.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc) で System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin で System.ServiceModel.Dispatcher.CompositeDispatchFormatter.DeserializeRequest(メッセージ メッセージ、Object[] パラメータ) でメッセージ、Object[] パラメータ) (MessageRpc& rpc) System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5 (MessageRpc& rpc) で System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc) での ProcessMessage41(MessageRpc& rpc) System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) での System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc) システムで。 ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc) で System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc) で System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc) で System.ServiceModel.Dispatcher.MessageRpc.Process(ブール isOperationContextSet)System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) で System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc) で System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc) で System.ServiceModel.Dispatcher .ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc) で System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc) で System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) で System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc) で System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc) で System.ServiceModel.Dispatcher System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc) の .ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc) System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc) での ProcessMessage2(MessageRpc& rpc) System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc) で System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc) での ProcessMessage2(MessageRpc& rpc) System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc) で System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

そしていつかこれ:

サーバーでリクエストの処理中にエラーが発生しました。例外メッセージは、「操作 'PostComments' の要求メッセージの本体をデシリアライズ中にエラーが発生しました。OperationFormatter で無効なメッセージ本文が検出されました。名前が「type」で値が「object」の属性が見つかるはずです。値「数値」が見つかりました。詳細については、サーバー ログを参照してください。例外スタック トレースは次のとおりです。

System.ServiceModel.Dispatcher.OperationFormatter.DeserializeRequest (メッセージ メッセージ、オブジェクト [] パラメーター) で System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest (メッセージ メッセージ、オブジェクト [] パラメーター) で System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequest (メッセージメッセージ、Object[] パラメータ) で System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc) で System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) で System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) でSystem.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) で System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

このサービスは昨日、Google の同じ残りのクライアントで正常に動作していたため、どこが間違っているのか本当にわかりません。このサービスをできるだけ早くサーバーに展開する必要があります。助けてください!!!!

[アップデート]

フィドラーの出力:

HTTP/1.1 400 不正な要求

Server: ASP.NET Development Server/10.0.0.0
Date: Thu, 27 Sep 2012 10:33:24 GMT
X-AspNet-Version: 4.0.30319
Content-Length: 3513
Cache-Control: private
Content-Type: text/html
Connection: Close

Google が送信する生の本文:

{
    "Id": "818744",
    "FullName": "Abhishek",
    "Email": "ab@gma.com",
    "Location": "Jaipur",
    "Comments": "asdkjfjk sdnfjlksdjlk dfljkfsd",
    "Type": "Style"
}

[UPDATE 2] Service Tracker を調べたところ、取得しているルート値に Number があり、サービスが Object を期待していることがわかりました。だから、それが何かを引き起こすなら、私は今完全に空白です...

4

1 に答える 1

1

投稿されているjsonには、大文字で始まるすべてのキーがあり、パブリックプロパティ(小文字属性でマークされています)は小文字で始まります。それらを一致させるか、使用 [Datamember(name="key")] を追加して、それらが適切にマッピングされていることを確認する必要があります。

于 2014-08-07T18:20:50.530 に答える