Wcf Rest调用HTTP / 1.1 400错误请求或HTTP / 1.1 404未找到

问题描述 投票:0回答:1

将请求发送到休息服务时遇到问题。该服务在我的桌面上正常工作,但当我在IIS上托管时收到以下错误。

我使用https时HTTP / 1.1 400 Bad Request

我使用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中尝试过不同的值,但结果是一样的。任何帮助将不胜感激。

rest wcf
1个回答
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风格服务的不错选择。如果问题仍然存在,请随时告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.