0

Restful WCF サービスの実装に最初のクラックがありましたが、オブジェクトを投稿できません:( clientstuff コードでクラッシュします (以下を参照)。何が修正されるのでしょうか??ありがとう

一部 web.config

<system.serviceModel>
    <services>
      <service name="MyRest.Service1" behaviorConfiguration="ServBehave">
        <!--Endpoint for REST-->
        <endpoint address="XMLService" binding="webHttpBinding" behaviorConfiguration="restPoxBehavior" contract="MyRest.IService1" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServBehave">
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true" />
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <!--Behavior for the REST endpoint for Help enability-->
        <behavior name="restPoxBehavior">
          <webHttp helpEnabled="true" />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

クライアントコード:

 public string ClientStuff()
        {
            var ServiceUrl = "http://localhost/MyRest/Service1.svc/XMLService/";
            var empserializer = new DataContractSerializer(typeof(MyRest.Employee));
            var url = new Uri(ServiceUrl + "PostEmp");
            var request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "POST";
            request.ContentType = "application/XML";
            var emp = new MyRest.Employee { DeptName = "sale", EmpName = "ted", EmpNo = 11112 };
            using (var requeststream = request.GetRequestStream())
            {
                empserializer.WriteObject(requeststream, emp);
            }
            var response = (HttpWebResponse)request.GetResponse();// crashes here with error in title
            var statuscode = response.StatusCode;
            return statuscode.ToString();
        }

service1.svc.cs

 public bool PostEmp(Employee employee)
        {
            //something
            return true;
        }

サービス契約

[ServiceContract]
public interface IService1
{
    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "/PostEmp", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
    bool PostEmp(Employee employee);

    // TODO: Add your service operations here
}
4

2 に答える 2

1

修正する必要があることがいくつかあります。最初のものはもちろん、適切なコンテンツ タイプ ヘッダーを使用することです。次のようなものはありませんapplication/XML

request.ContentType = "text/xml";

もう 1 つはEmployee、サーバーとクライアントでまったく同じクラスを参照していることを確認することです。そうしないと、クライアント データ コントラクト シリアライザーが XML で別の名前空間を生成し、サーバーがクラッシュします。基本的に、このEmployeeクラスは、サーバーとクライアント アプリケーションの間の共有クラス ライブラリで宣言する必要があります。

ところで、ここに質問を投稿する代わりに、将来この種の問題を自分で簡単にデバッグできるようにするには、サービス側でトレースを有効にするだけです。

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

次に、組み込みの .NET SDK トレース ビューアー ( SvcTraceViewer.exe ) を使用して、生成されたログ ファイルをロードするだけで、すべてが表示され、GUI で説明されます (90 年代のもののように見えますが、機能します)。 .

ところで、web.config から次の行を削除して、ASP.NET 互換性を無効にする必要がある場合があります。

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />

100% 確実ではありませんが、IIRC ではこれが REST 対応サービスで必要でした (これに関しては間違っている可能性があります)。

于 2012-07-26T13:47:39.153 に答える