【发布时间】:2016-03-31 20:36:57
【问题描述】:
我制作了一个托管 WCF 服务的小型控制台应用程序,该应用程序也是客户端并实现该服务。
它在我的本地机器上运行良好,并将 JSON 格式的数据返回到网络浏览器。我使用带有 Advanced Rest CLient 的 Chrome 浏览器,但也使用了 javascript 客户端并成功读取了响应。
我在服务器上部署了可执行文件并将端点地址更改为域名。在正确的端口访问域上的服务也显示服务已激活,我也可以远程访问 wsdl。
当我尝试发布时,我收到一个 http 400 错误请求错误。我无法弄清楚为什么这在本地可以正常工作,但在远程服务器上却不行。
[ServiceContract]
public interface IService
{
[WebInvoke(UriTemplate = "/getRecipes/",
Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
[OperationContract]
object[][] getRecipes();
}
public class Service : IService
{
private static bool IgnoreCertificateErrorHandler(object Sender,
System.Security.Cryptography.X509Certificates.X509Certificate Cert,
System.Security.Cryptography.X509Certificates.X509Chain Ch,
System.Net.Security.SslPolicyErrors PolErr)
{
return true;
}
public object[][] getRecipes()
{
//this is the place where implement a client implementation of a webservice and it full the object array beneath, this returns more then 200 rows.
object[][] QueryResult;
return QueryResult;
}
}
App.config:
<system.serviceModel>
<services>
<service name="CS.Service" behaviorConfiguration="PageBehave">
<host>
<baseAddresses>
<add baseAddress="http://domain.com:9001/Service"/>
</baseAddresses>
</host>
<endpoint address="http://domain.com:9001/Service" binding="webHttpBinding" behaviorConfiguration="webBehavior" contract="CS.IService"/>
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="webBehavior">
<webHttp/>
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="PageBehave">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
更新:
此应用程序是与远程 Web 服务通信的桥梁。目前我得到的错误是:无法解析远程名称:
. The exception stack trace is:
System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
at System.Net.HttpWebRequest.GetRequestStream()
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
`at ConsoleApplication1.ABC.ABC.select(String sql, Object[] params) in`
c:\Users\---\Desktop\--\--\Web References\ABC\Reference.cs:line 81
at CS.Service.getRecipeDetails(String number) in c:\Users\--\Desktop\---\ConsoleApplication1\Program.cs:line 134
at SyncInvokegetRecipeDetails(Object , Object[] , Object[] )
at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
这个桥接应用程序在我尝试过的任何本地机器上都能完美运行。只是服务器出了问题。
【问题讨论】:
-
当您没有将任何参数传递给 getRecipes() 时,您是否有任何理由使用 Method = "POST"?使用 GET 方法可能会有所帮助。
-
我改成GET了,但是没有效果。它在本地工作,但在远程服务器上不起作用。我还创建了一个返回包含字符串的静态对象数组的新方法。似乎这可以成功请求,因为响应显示在 XMLHttpRequest 中。我的第一种方法可以有很大的响应大小吗?尽管这在本地运行良好,但这在远程服务器上是否重要?
标签: c# wcf rest proxy webhttpbinding