代码之家  ›  专栏  ›  技术社区  ›  hkjhadj1

WCF服务错误400 VS2017中的错误请求

wcf
  •  0
  • hkjhadj1  · 技术社区  · 6 年前

    我在VS2017中有一个非常简单的WCF服务项目。但是当我试图访问端点时,我总是得到错误400。我已经阅读了这里关于同一问题的其他问题,到目前为止,我已经毫无运气地尝试了这些问题。

    我的服务合同:

    [ServiceContract]
    public interface IService
    {
        [OperationContract]
        [WebInvoke(Method = "GET",
                BodyStyle = WebMessageBodyStyle.Wrapped,
                RequestFormat = WebMessageFormat.Json,
                ResponseFormat = WebMessageFormat.Json,
                UriTemplate = "/GetData/{value}")]
        string GetData(string value);
    }
    

    我的服务:

    public class Service : IService
    {
        public string GetData(string value)
        {
            return string.Format("You entered: {0}", value);
        }
    }
    

    我的web.config:

      <system.serviceModel>
        <behaviors>
          <serviceBehaviors>
            <behavior name="myBehavior">
              <serviceMetadata httpGetEnabled="true" />
              <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
            <behavior name="">
              <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
              <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
    
        <services>
          <service behaviorConfiguration="myBehavior" name="WCGFService1.Service">
            <endpoint address="" contract="WCGFService1.IService" binding="webHttpBinding">
            </endpoint>
          </service>
        </services>
    

    当我访问 http://localhost:61648/Service.svc/GetData/12 ,我收到HTTP 400错误请求。我试过浏览器和邮递员。我做错什么了?

    我正在使用VS2017。我的iservice.cs和service.cs位于app_code文件夹中,而 service.svc在根文件夹中。另外,当我尝试添加 name 和; contract 在web.config中,vs2013建议使用名称空间和接口/类名,而vs2017不建议使用任何内容,因此我必须手动键入它。

    此外,在VS2013中,接口和类位于根文件夹中,而不是位于app_code文件夹中。该项目是VS2017中的WCF应用程序。我的.NET版本是4.5.2。

    1 回复  |  直到 6 年前
        1
  •  0
  •   hkjhadj1    6 年前

    修复了它,web.config文件中有一些问题:

    <system.serviceModel>
        <behaviors>
          <!-- Fix 1: Added a endpointBehavoir with webHttp -->
          <endpointBehaviors>
            <behavior name="web">
              <webHttp />
            </behavior>
          </endpointBehaviors>
          <serviceBehaviors>
            <behavior name="myBehavior">
              <serviceMetadata httpGetEnabled="true" />
            </behavior>
          </serviceBehaviors>
    
        </behaviors>
    
        <services>
          <!-- Fix 2: Instead of using the full name (WCGFService1.Service), used just the class name (Service) -->
          <service behaviorConfiguration="myBehavior" name="Service">
          <!-- Fix 3: Same thing here, used just the IService instead of full name, also, used the aforementioned endpointBehavoir -->
            <endpoint address="" contract="IService" binding="webHttpBinding" behaviorConfiguration="web">
            </endpoint>
          </service>
        </services>
    
        <protocolMapping>
            <add binding="basicHttpsBinding" scheme="https" />
        </protocolMapping>    
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
      </system.serviceModel>
    

    不管出于什么原因,在VS2013中,如果您不提供全名(名称空间和类/接口名称),它将不起作用,但在VS2017中,它仅在您提供类/接口名称时起作用。