远程服务器返回一个错误:(400)错误的请求

问题描述:

我试图使用WCF Restful Service。服务配置是如下远程服务器返回一个错误:(400)错误的请求

<system.serviceModel> 
<bindings> 
    <wsHttpBinding> 
    <binding name="wsHttp" maxReceivedMessageSize ="50000000" maxBufferPoolSize="50000000" > 
     <readerQuotas maxDepth="500000000" maxArrayLength="500000000" maxBytesPerRead="500000000" maxNameTableCharCount="500000000" maxStringContentLength="500000000"/> 
     <security mode="None" /> 
    </binding> 
    </wsHttpBinding> 
</bindings> 
    <services> 
    <service behaviorConfiguration="ItemTracker.ItemTrackerServiceBehavior" name="ItemTracker.ItemTrackerService"> 
      <endpoint address="http://localhost:8003/ItemTracker/ItemTrackerService.svc" binding="wsHttpBinding" contract="ItemTracker.IItemTrackerService" bindingConfiguration="wsHttp"> 
       <identity> 
        <dns value="localhost"/> 
       </identity> 
      </endpoint> 
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="ItemTracker.ItemTrackerServiceBehavior"> 
       <!-- 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> 
</system.serviceModel> 

的接口被定义为如下

Imports System.ServiceModel.Web 
<ServiceContract([Namespace]:="http://localhost:8003/ItemTracker/")> _  
Public Interface IItemTrackerService 

<OperationContract()> _ 
<WebInvoke(Method:="POST", RequestFormat:=WebMessageFormat.Xml, ResponseFormat:=WebMessageFormat.Xml, UriTemplate:="GetItemTrackingDetails")> _ 
Function GetItemTrackingDetails(ByVal TrackingNo As String) As String 

End Interface 

RESTful服务的调用客户端应用程序是如下

Dim req As HttpWebRequest = Nothing 
    Dim res As HttpWebResponse = Nothing 

    Dim url As String = "http://localhost:8003/ItemTracker/ItemTrackerService.svc?wsdl/GetItemTrackingDetails/" 
    req = DirectCast(WebRequest.Create(url), HttpWebRequest) 
    req.Method = "POST" 
    req.ContentType = "application/soap+xml; charset=utf-8" 
    req.Timeout = 30000 
    req.Headers.Add("SOAPAction", url) 
    Dim xmlDoc As New System.Xml.XmlDocument() 
    xmlDoc.XmlResolver = Nothing 
    xmlDoc.Load(AppDomain.CurrentDomain.BaseDirectory & "\test.xml") 
    Dim sXML As String = xmlDoc.InnerXml 
    req.ContentLength = sXML.Length 
    Dim sw As New System.IO.StreamWriter(req.GetRequestStream()) 
    sw.Write(sXML) 
    sw.Close() 
    res = DirectCast(req.GetResponse(), HttpWebResponse) 

输入XML是这样的。

<GetItemTrackingDetails xmlns="http://localhost:8003/ItemTracker/"> 
<TrackingNo>A10001</TrackingNo> 
</GetItemTrackingDetails> 

代替本地主机系统名称是用来

GetItemTrackingDetails的输出是XML。有了这个我越来越差的请求400而不是xml

有没有人可以帮助我。

此URL看起来很奇怪:

Dim url As String = "http://localhost:8003/ItemTracker/ItemTrackerService.svc?wsdl/GetItemTrackingDetails/" 

它的工作更好,如果你删除?wsdl

Dim url As String = "http://localhost:8003/ItemTracker/ItemTrackerService.svc/GetItemTrackingDetails/" 
+0

仍然我得到相同的错误 –

你并不需要指定的URL实际的服务,只是网址面膜:

http://localhost:8003/ItemTracker/GetItemTrackingDetails/ 

而且你必须一个占位符添加到您的网址面膜包含输入参数你的操作:

UriTemplate:="GetItemTrackingDetails/{0}" 

这使您可以拨打实际的URL,并在URL的末尾传递TrackingNo变量:

http://localhost:8003/ItemTracker/GetItemTrackingDetails/999AAA 
+0

现在我收到错误“远程服务器返回错误:(404)未找到。”这是post方法。所以我使用WebInvoke并将xml文件作为输入。 –

+0

如果你把http:// localhost:8003放入Internet Explorer会发生什么? –

+0

HTTP错误403.14 - 禁止Web服务器配置为不列出此目录的内容。我得到这个错误。但即使在启用目录浏览后,我仍然通过客户端代码 –