2012-07-23 48 views
1

我正嘗試創建一個以Azure Web角色託管的WCF服務。該服務必須能夠通過肥皂和休息到達。無法通過郵政到達WCF休息端點

我一直在閱讀一些文章,並能夠創建(或至少我是這麼認爲)所有規格的服務。

我試圖做的是要消耗我的REST端點用了SoapUI項目,做與所有參數的查詢字符串一個帖子,但是當我運行這個項目,我得到的迴應是:

服務器在處理請求時遇到錯誤。異常消息是'錯誤反序列化操作'CPlano'的請求消息體。 OperationFormatter無法反序列化消息中的任何信息,因爲消息是空的(IsEmpty = true)。'

這裏是我的web.config的一部分:

<bindings> 
    <webHttpBinding> 
    <binding name="webBinding" maxReceivedMessageSize ="50000000" maxBufferPoolSize="50000000"> 
     <readerQuotas maxDepth="500000000" maxArrayLength="500000000" maxBytesPerRead="500000000" 
        maxNameTableCharCount="500000000" maxStringContentLength="500000000"/> 
     <security mode="None" /> 
    </binding> 
    </webHttpBinding> 
</bindings> 
<behaviors> 
    <endpointBehaviors> 
    <behavior name="RestBehavior"> 
     <webHttp/> 
    </behavior> 
    </endpointBehaviors> 
    <serviceBehaviors> 
    <behavior name="ServiceBehavior"> 
     <!-- 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="true"/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<services> 
    <service name="Namespace.CService" behaviorConfiguration="ServiceBehavior"> 
    <endpoint name="RESTEnpoint" contract="Namespace.ICService" binding="webHttpBinding" bindingConfiguration="webBinding" bindingNamespace="http://www.example.com/" address="rest" behaviorConfiguration="RestBehavior" /> 
    <endpoint name="SOAPEndpoint" contract="Namespace.ICService" binding="basicHttpBinding" bindingNamespace="http://www.example.com/" address=""></endpoint> 
    </service> 
</services> 

而且,這裏是我的服務接口聲明:

[ServiceContract(Namespace = "http://www.example.com/")] 
public interface ICService 
{ 
    [OperationContract] 
    [WebInvoke(UriTemplate = "/CPlano", 
    BodyStyle = WebMessageBodyStyle.Wrapped, 
    Method = "POST")] 
    RespuestaCotizador CPlano(int idUsuario, string usuario, string pass, int modalidad, int servicio, 
     int medicion, string paisDestino, int envio, decimal peso, decimal largo, decimal ancho, decimal alto); 
} 

最後我響應等級:

[DataContract(Namespace = "http://www.example.com/")] 
public class RespuestaCotizador 
{ 
    [DataMember] 
    public bool HasError; 
    [DataMember] 
    public string ErrorMessageESP; 
    [DataMember] 
    public string ErrorMessageENG; 
    [DataMember] 
    public decimal PrecioCotizado; 

    public RespuestaCotizador() 
    { 
     HasError = false; 
     ErrorMessageESP = string.Empty; 
     ErrorMessageENG = string.Empty; 
     PrecioCotizado = 0; 
    } 
} 

我使用統一進行依賴注入,但這似乎是n有關。

即使我在本地運行服務,我甚至可以達到第一個斷點。

+0

鑑於您看到的異常消息,我不知道SoapUI是否正確設置了對該服務的調用。 WCF正在接收消息並嘗試將傳入消息更改爲CPlano對象,但由於它認爲該消息不包含任何信息而失敗。您是否嘗試過使用Visual Studio附帶的WCFTestClient.exe甚至是單獨的項目來測試您的服務? SoapUI以外的其他東西排除了SoapUI成爲問題? 此外,嘗試在模擬器外部運行Web項目(將其設置爲啓動項目)以排除Azure。 – MikeWo 2012-07-23 23:57:31

+0

嗨!我嘗試過使用WCFTestClient ...但我認爲它只使用soap端點來調用服務......使用此工具,我從服務中收到了正確答案。 – user1547073 2012-07-24 00:13:09

+0

是的,你和Ming Xu是對的,WCFTest客戶端不測試REST端點,但是如果SOAP端點正確回答,那麼你已經排除了服務本身的問題,現在你只需要查看REST端點或調用者是問題。當你使用不同的工具時會發生什麼(像Ming建議的提琴手,甚至是另一個項目)? – MikeWo 2012-07-27 11:36:45

回答

0

你想使用SOAP還是REST?如果你想使用SOAP,那麼使用另一個綁定,比如BasicHttpBinding。 WebHttpBinding通常用於REST服務。如果你想使用REST,你可以創建一個封裝類似idUsuario和usuario的類。配置服務方法以接受單個參數:您的新類。然後在執行POST時,將一個序列化對象作爲請求主體。另外,您不能使用WCF測試客戶端來使用REST服務。它只支持SOAP。但是,您可以使用Fiddler。或者(推薦用於新服務),使用ASP.NET Web API而不是WCF來構建REST服務。