1

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

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

我想要做的是使用 SoapUI 项目使用我的休息端点,使用带有所有参数的查询字符串执行 POST,但是当我运行这个项目时,我得到的响应是:

服务器在处理请求时遇到错误。异常消息是“反序列化操作“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;
    }
}

我正在使用统一进行依赖注入,但这似乎无关紧要。

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

4

1 回答 1

0

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

于 2012-07-25T11:58:25.720 回答