2011-07-21 72 views
0

我有一個要求,創建一個Web服務,客戶端和服務將在簡單的肥皂中說話(該請求和響應將是肥皂),我試着在網上找到一個示例示例,事情已經完成或一些代碼示例,以便我可以開始,但我認爲我在谷歌搜索不好,這就是爲什麼目前找不到任何一個,有人建議使用WCF所以得到一篇文章WCF 405 webmethod找不到問題

http://csharping.com/wcf/building-a-soap-response-envelope-manually-with-the-message-class/

但同樣我的問題不解決,我試圖創建與此示例應用程序(有這麼多的問題:()

創建一個控制檯應用程序和Program.cs是

using System; 
using System.IO; 
using System.Net; 
using System.ServiceModel; 
using System.ServiceModel.Channels; 
using System.ServiceModel.Description; 
using System.Text; 
using System.Runtime.Serialization; 


namespace ServiceConsole 
{ 
    public class Program 
    { 
     static void Main(string[] args) 
     { 
      using (ServiceHost serviceHost = new ServiceHost(typeof(ServiceClient), new Uri("http://localhost:2000/"))) 
      { 
       ServiceEndpoint serviceEndpoint = new ServiceEndpoint(
        ContractDescription.GetContract(typeof(IService)));    

       ServiceEndpoint metadataEndpoint = new ServiceEndpoint(
        ContractDescription.GetContract(typeof(IMetadataExchange)));    

       ServiceMetadataBehavior metadataBehavior = serviceHost.Description.Behaviors.Find<ServiceMetadataBehavior>(); 
       if (metadataBehavior == null) 
       { 
        metadataBehavior = new ServiceMetadataBehavior(); 
        metadataBehavior.HttpGetEnabled = true; 
        serviceHost.Description.Behaviors.Add(metadataBehavior); 
       } 


       serviceHost.AddServiceEndpoint(typeof(IService), new BasicHttpBinding(), "http://localhost:2000/"); 
       serviceHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "http://localhost:2000/WCFService/mex"); 
       serviceHost.Open(); 

       string requestData = "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Header><h:HeaderItem xmlns:h=\"http://tempuri.org/\">a header item</h:HeaderItem><ActivityId CorrelationId=\"090c553b-bfcc-4e4f-94cd-1b4333fe82a9\" xmlns=\"http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics\">377a454b-b543-4c6f-b4ac-3981029b60e6</ActivityId></s:Header><s:Body><string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">a body item</string></s:Body></s:Envelope>"; 
       byte[] requestDataBytes = Encoding.UTF8.GetBytes(requestData); 

       HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost/WCFService/"); 
       request.Method = "POST"; 
       request.ContentType = "text/xml; charset=utf-8"; 
       request.Headers.Add("SOAPAction", "http://tempuri.org/IWebService/GetMessage"); 
       request.ContentLength = requestDataBytes.Length; 

       StreamWriter streamWriter = new StreamWriter(request.GetRequestStream()); 
       streamWriter.Write(requestData); 
       streamWriter.Flush(); 
       streamWriter.Close(); 
       HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
       StreamReader streamReader = new StreamReader(response.GetResponseStream()); 
       string responseBody = streamReader.ReadToEnd(); 

       Console.WriteLine("Service returned the following response..."); 
       Console.WriteLine(""); 
       Console.WriteLine(responseBody); 
       Console.ReadKey(); 
       serviceHost.Close(); 
      } 
     } 
    } 
} 

app.config我產生使用svcutil.exe的是這樣的

 <?xml version="1.0" encoding="utf-8"?> 
     <configuration> 
      <system.serviceModel> 
      <bindings> 
       <basicHttpBinding> 
       <binding name="BasicHttpBinding_IService" closeTimeout="00:01:00" 
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
        allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
        maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
        messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
        useDefaultWebProxy="true"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
        <security mode="None"> 
        <transport clientCredentialType="None" proxyCredentialType="None" 
         realm="" /> 
        <message clientCredentialType="UserName" algorithmSuite="Default" /> 
        </security> 
       </binding> 
       </basicHttpBinding> 
      </bindings> 
      <client> 
       <endpoint address="http://localhost:2000/WebService/Service.svc" 
        binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService" 
        contract="IService" name="BasicHttpBinding_IService" /> 
      </client> 
      </system.serviceModel> 
     </configuration> 

我webservioce像(它是一個WCF網站在其中端口是由我提供的是2000

服務合同是

[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 
    Message GetMessage(Message s); 
} 

[ServiceBehavior] 
public class Service : IService 
{ 
    public Message GetMessage(Message message) 
    { 
     string body = message.GetBody<string>(); 
     return Message.CreateMessage(MessageVersion.Soap11, "http://tempuri.org/IWebService/GetMessageResponse", "body is " + body); 
    } 

}

web.config

<system.serviceModel> 
    <services> 
     <service behaviorConfiguration="ServiceBehavior" name="Service"> 
     <endpoint address="http://localhost:2000/WebService/Service.svc" binding="basicHttpBinding" bindingConfiguration="" 
      contract="IService" > 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     <host> 
      <timeouts closeTimeout="00:01:10" /> 
     </host> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="ServiceBehavior"> 
      <serviceMetadata httpGetEnabled="true" policyVersion="Policy15" /> 
      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

我的問題是405的WebMethod不是身體誰能告訴我什麼是這個問題,我是新來的WCF之前,這創造了一個樣本,這是我的第二個應用程序

回答

0

您不需要手動創建SOAP消息,只需使用基本的http綁定即可使用SOAP。

+0

任何例子,我可以測試它,請和客戶端請求,謝謝你的回覆 – Sharee

0

當你有一個WCF服務時,整點就是你可以定義例如參數如字符串,int等 - 而且您不必混淆XML和SOAP標題和主體的負載。

所以基本上,你的服務合同應該是這樣的:

[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 
    int DoSomeMathAddTowNumbers(int num1, int num2); 
} 

和服務實現會那麼就執行該方法中,添加兩個數字,並返回結果:

public class Service : IService 
{ 
    int DoSomeMathAddTowNumbers(int num1, int num2) 
    { 
     return num1 + num2; 
    } 
} 

沒有與Message或XML操作或任何東西混亂。

想要調用客戶端的服務將創建一個使用svcutil或在Visual Studio Add Service Reference方法的WCF客戶端代理,並會得到具有相同的方法,因爲它連接到服務代理類 - 你會打電話給他們,採用了直板的,易於參數 - 是這樣的:

ServiceClient client = new ServiceClient(); 
int result = client.DoSomeMathAddTwoNumbers(42, 100); 

所以基本上,我認爲你需要回到繪圖板和重新閱讀了關於WCF的基礎 - 它應該是那很難,真的! (這是整點 - 它應該使服務容易 ...)

退房的Beginner's Guide at the WCF Developer Center在MSDN - 它包含了許多關於如何開始使用WCF.-

你可能也想看看開始真的很不錯的視頻,截屏,文章DOTNET的岩石電視情節#135 :Keith Elder Demystifies WCF

+0

感謝您的答覆,創建這樣的事情並不困難,有一百個樣本可用,但要求是通過saop消息不是整數或雙通道肥皂和肥皂,我也會檢查這個視頻,謝謝你的鏈接和回覆 – Sharee

+0

WCF服務**是** p分析SOAP消息! ....但你不必自己手動組裝這些消息 - WCF運行時將爲你做到這一點.... –

+0

如果我們必須這樣做,我們可以做或不做 – Sharee