无法通过邮件到达WCF休息端点

时间:2012-07-23 22:54:52

标签: wcf rest soap azure unity-container

我正在尝试创建一个托管在Azure Web角色中的WCF服务。该服务必须能够通过肥皂和休息来获得。

我一直在阅读一些文章,并且能够创建(或者至少我认为是这样)具有所有规范的服务。

我要做的是使用SoapUI项目使用我的休息端点,使用包含所有参数的查询字符串进行POST,但是当我运行此项目时,我得到的响应是:

  

服务器在处理请求时遇到错误。异常消息是'对操作'CPlano'反序列化请求消息体时出错“。 OperationFormatter无法反序列化Message中的任何信息,因为Message为空(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;
    }
}

我使用unity来进行依赖注入,但这似乎是无关紧要的。

即使我在本地运行服务,我甚至可以到达第一个断点。

1 个答案:

答案 0 :(得分:0)

您想使用SOAP还是REST?如果要使用SOAP,则使用另一个绑定,例如BasicHttpBinding。 WebHttpBinding通常用于REST服务。如果要使用REST,可以创建一个封装idUsuario和usuario等所有内容的类。配置服务方法以接受单个参数:您的新类。然后在执行POST时,将序列化对象作为请求主体传递。此外,您不能使用WCF测试客户端来使用REST服务。它只支持SOAP。但是,您可以使用Fiddler。或者(并推荐用于新服务),使用ASP.NET Web API而不是WCF来构建REST服务。