Wcf剩余呼叫HTTP / 1.1 400错误的请求或未找到HTTP / 1.1 404

时间:2019-04-15 19:40:29

标签: rest wcf

在将请求发送到休息服务时遇到了麻烦。该服务在我的桌面上可以正常运行,但是当我在IIS上托管时出现以下错误。

我使用https时

HTTP / 1.1 400错误的请求

使用http时找不到HTTP / 1.1 404

这是我的web.config

<system.serviceModel>
<bindings>
<webHttpBinding>
<binding name="webBinding">
<security mode="Transport">
</security>
</binding>
</webHttpBinding>
</bindings>
<services>
<service     
behaviorConfiguration="CoreService.DialService.DialServiceBehavior" 
name="CoreService.DialService.TelephonyService">
<endpoint behaviorConfiguration="webBehavior" binding="webHttpBinding" 
bindingConfiguration="webBinding" 
contract="CoreService.DialService.ITelephonyService"/>
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="webBehavior">
<webHttp helpEnabled="true"/>
</behavior>
</endpointBehaviors>
<serviceBehaviors> 
<behavior name="CoreService.DialService.DialServiceBehavior">
<serviceMetadata httpsGetEnabled="true" httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<protocolMapping>
<add binding="webHttpBinding" scheme="http"/>
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" 
multipleSiteBindingsEnabled="true"/>
<diagnostics>
<messageLogging logEntireMessage="true" logMalformedMessages="true" 
logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" 
maxMessagesToLog="3000" maxSizeOfMessageToLog="2000"/>
</diagnostics>
</system.serviceModel>

服务合同

[WebInvoke(UriTemplate = "/Dial", Method = "POST", RequestFormat = 
    WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
    [OperationContract]
    Objects.Response.Telephony.DialResponse 
    Dial(Objects.Request.Telephony.DialRequest request);

这是客户

DialRequest DialRequest = new DialRequest();
DialResponse DialResponse = new DialResponse();

DialRequest.ProjectID = "AMS0103300";
DialRequest.DialFromExtension = "1234";
DialRequest.OutDialCode = "51";
DialRequest.RequestBy = "HC User";
DialRequest.DialToPhoneNumber = "1234567890";
DialRequest.RequestDate = DateTime.Now;
DialRequest.ApplicationID = Guid.Parse("F5EE534B-B5ED-4ADD-B671- 
CCF7C05057A7");


DataContractJsonSerializer ser =
new 
DataContractJsonSerializer(typeof(Objects.Request.Telephony.DialRequest));

MemoryStream mem = new MemoryStream();
ser.WriteObject(mem, DialRequest);
string data =
Encoding.UTF8.GetString(mem.ToArray(), 0, (int)mem.Length);

WebClient webClient = new WebClient();
webClient.Headers["Content-type"] = "application/json";
webClient.Encoding = Encoding.UTF8;


var result = webClient.UploadString("https://test.xxxx.com/DialService/TelephonyService.svc/Dial","POST", data);

我在protocolMapping中尝试使用不同的值,但是结果是相同的。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

在我看来,您的项目中没有错误。除了协议映射之外,Net4.5的新功能还可以帮助我们简化设置。
https://docs.microsoft.com/en-us/dotnet/framework/wcf/simplified-configuration
How to make WCF Service Use HTTPS protocol
在IIS上托管服务的过程中可能会有一些小问题。 您能否成功访问WSDL页面? 如下形式。 enter image description here 我们可能需要在控制面板中启用WCF功能。 https://i.stack.imgur.com/ivP92.png
我举了一个例子,希望对您有用。
服务器端(WCF服务应用程序)。
IService1

    [ServiceContract]
    public interface IService1
    {

        [OperationContract]
        [WebGet]
        string GetData(int value);

        [OperationContract]
        CompositeType GetDataUsingDataContract(CompositeType composite);

        [OperationContract]
        [WebInvoke(UriTemplate ="/MyTest",Method ="POST",RequestFormat =WebMessageFormat.Json,ResponseFormat =WebMessageFormat.Json)]
        string Test(CompositeType compositeType);
}
    [DataContract]
    public class CompositeType
    {
        bool boolValue = true;
        string stringValue = "Hello ";

        [DataMember]
        public bool BoolValue
        {
            get { return boolValue; }
            set { boolValue = value; }
        }

        [DataMember]
        public string StringValue
        {
            get { return stringValue; }
            set { stringValue = value; }
        }

        public override string ToString()
        {
            return $"The BoolValue is {boolValue}, StringValue is {stringValue}";
        }
    }

Service1.svc.cs

public class Service1 : IService1
{
    public string GetData(int value)
    {
        return string.Format("You entered: {0}", value);
    }

    public CompositeType GetDataUsingDataContract(CompositeType composite)
    {
        if (composite == null)
        {
            throw new ArgumentNullException("composite");
        }
        if (composite.BoolValue)
        {
            composite.StringValue += "Suffix";
        }
        return composite;
    }

    public string Test(CompositeType compositeType)
    {
        return compositeType.ToString();
    }
}

Web.config

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior>
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <bindings>
      <webHttpBinding>
        <binding name="mybinding">
          <security mode="Transport">
            <transport clientCredentialType="None"></transport>
          </security>
        </binding>
      </webHttpBinding>
    </bindings>
    <protocolMapping>
      <add binding="webHttpBinding" scheme="http"/>
      <add binding="webHttpBinding" scheme="https" bindingConfiguration="mybinding"/>
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

IIS(新网站)
enter image description here
客户(通过添加服务参考来生成数据合同)

static void Main(string[] args)
        {
            //for validating the self-signed certificated.
            ServicePointManager.ServerCertificateValidationCallback += delegate
              {
                  return true;
              };
            ServiceReference1.CompositeType composite = new ServiceReference1.CompositeType()
            {
                StringValue = "Hello",
                BoolValue = true
            };
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(ServiceReference1.CompositeType));

            MemoryStream ms = new MemoryStream();
            serializer.WriteObject(ms, composite);
            string data = Encoding.UTF8.GetString(ms.ToArray(), 0, (int)ms.Length);

            WebClient webclient = new WebClient();
            webclient.Headers["Content-type"] = "application/json";
            webclient.Encoding = Encoding.UTF8;
            var result = webclient.UploadString("https://localhost:8734/service1.svc/MyTest", "POST", data);
            Console.WriteLine(result);

            WebClient webclient2 = new WebClient();
            webclient2.Headers["Content-type"] = "application/json";
            webclient2.Encoding = Encoding.UTF8;
            var result2 = webclient2.UploadString("http://localhost:8733/service1.svc/MyTest", "POST", data);
            Console.WriteLine(result2);

        }

结果。
enter image description here
此外,PostMan是测试Rest风格服务的不错选择。 随时让我知道问题是否仍然存在。