3

私は数日からwcf restfulサービスを利用しようとしていますが、それは私に悪い要求を与えています. 私を助けてください。

ここに私の設定ファイルがあります

<system.serviceModel>

<bindings>
  <webHttpBinding>
    <binding name="state" allowCookies="true">
      <security mode="None"></security>

    </binding>
  </webHttpBinding>
</bindings>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
<behaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehaviour">
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="True"/>
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="web">
      <webHttp/>
    </behavior>
  </endpointBehaviors>
</behaviors>
<services>
  <service behaviorConfiguration="ServiceBehaviour" name="RESTFUL_DEMO.Web.services.Calc">
    <endpoint address="" bindingConfiguration="state" binding="webHttpBinding" name="Http" contract="RESTFUL_DEMO.Web.services.ICalc"/>
    <endpoint address="abcd" binding="wsHttpBinding" name="wsHttp" contract="RESTFUL_DEMO.Web.services.ICalc"/>

    <endpoint address="mex" binding="mexHttpBinding" name="MEX" contract="IMetadataExchange"/>

  </service>
</services>

サービス コントラクトとデータ コントラクトのインターフェイスは次のとおりです。

[ServiceContract(SessionMode = SessionMode.Allowed)]
[XmlSerializerFormat]
public interface ICalc
{
    [OperationContract]
    [WebInvoke(UriTemplate = "dowork", Method = "POST", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)]
    int DoWork(Enroll a);
}


[DataContract]
public class Enroll
{
    public Enroll()
    {

    }
    public Enroll(string Avalue)
    {
        this.Avalue = Avalue;
    }
    [DataMember(IsRequired = true)]
    public string Avalue
    {
        get;
        set;
    }


}

サービスを消費する私のコードは次のとおりです

HttpWebRequest request = WebRequest.Create("http://localhost/RESTFUL_DEMO.Web/services/Calc.svc/dowork") as HttpWebRequest;
XmlDocument doc = new XmlDocument();
        doc.Load(@"d:\test.xml");
        string sXML = doc.InnerXml;
        request.ContentLength = sXML.Length;
        request.ContentType = "test/xml; charset=utf-8";
        var sw = new StreamWriter(request.GetRequestStream());
        sw.Write(sXML);
        sw.Close();
        WebResponse response = request.GetResponse();
        StreamReader stream = new StreamReader(response.GetResponseStream());
        String result = stream.ReadToEnd();
4

3 に答える 3

2

Rest サービスの使用中に小さな間違いを犯しました。/xmlをテストするリクエストの ContentType を指定しました。charset=utf-8 ですが、text/xml または application/xml である必要があります。

request.ContentType = "text/xml; charset=utf-8";

またはそうあるべきです

request.ContentType = "application/xml";
于 2013-04-30T13:31:52.160 に答える
0

私の場合、サービス インターフェイス IBookService.cs のメソッドは次のようになります。

[OperationContract]
[WebInvoke(Method = "PUT", UriTemplate = "/Book", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
IList<Book> UpdateBook(Book book);

そして私のクライアントで私が与えていた

client.Headers[HttpRequestHeader.ContentType] = "text/xml";  

それ以外の

client.Headers[HttpRequestHeader.ContentType] = "text/json";

それは私の問題を解決しました。私の完全な解決策については、以下を参照してください

 private void btnUpdateBook_Click(object sender, EventArgs e)
    {
        try
        {
            using(WebClient client = new WebClient())
            {
                client.Headers[HttpRequestHeader.ContentType] = "text/json";                   
                Uri uri = new Uri(@"http://localhost:8085/BookService/Book");

                Book updateBook = new Book() { Id = 3, Name = "UpdateBook Name 3", Price = 77.77f };

                MemoryStream requestStream = new MemoryStream();
                DataContractJsonSerializer requestSerializer = new DataContractJsonSerializer(typeof(Book));
                requestSerializer.WriteObject(requestStream, updateBook);

                client.UploadDataCompleted += OnUpdateBookCompleted;
                client.UploadDataAsync(uri, "PUT",requestStream.ToArray());
            }
        }
        catch (Exception ex)
        {

        }
    }

    void OnUpdateBookCompleted(object sender, UploadDataCompletedEventArgs e)
    {
        byte[] result = e.Result as byte[];
        MemoryStream responseStream = new MemoryStream(result);
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(IList<Book>));
        IList<Book> books = (IList<Book>)serializer.ReadObject(responseStream);

        bindingSource1.DataSource = books;
        dvBooks.DataSource = bindingSource1;
    }
于 2015-07-24T18:54:06.907 に答える
-2

Visual Studio のインスタンスでサービスを起動して実行し、テスト クライアントを使用して、サービスが正常に実行されていることを確認します。

VS の新しいインスタンスを開き、クライアント コードをビルドするサービス参照を追加してから、このクライアントを使用してサービスを呼び出します。

于 2013-04-30T13:33:06.963 に答える