0

私は新しく、Windows アプリケーションと Web サイト WCF Web サービスとの通信を実装するのに問題があります。エラーが表示され続け、何度も試しました。誰かが私を助けてくれることを願っています~~

Webサイト

IApiService.cs

[ServiceContract]
public interface IApiService
{
    [OperationContract]
    [WebInvoke(Method = "POST",
          BodyStyle = WebMessageBodyStyle.Wrapped,
          ResponseFormat = WebMessageFormat.Json)]
    Boolean TestConnection();

    [OperationContract]  
    [WebInvoke(Method = "POST",
          BodyStyle = WebMessageBodyStyle.Wrapped,
          ResponseFormat = WebMessageFormat.Json)]
    Boolean IsPhoneNumberListMatch(int pa, int pb);

    [OperationContract]
    [WebInvoke(Method = "POST",
          BodyStyle = WebMessageBodyStyle.Wrapped,
          ResponseFormat = WebMessageFormat.Json)]
    List<ClientPhoneModel> GetAllPhoneNumber(string pa);

    [OperationContract]
    [WebInvoke(Method = "POST",
          BodyStyle = WebMessageBodyStyle.Wrapped,
          ResponseFormat = WebMessageFormat.Json)]
    List<ClientRegistrationModel> GetAllNewRegistration(string pa);
}

web.config

<system.serviceModel>
    <behaviors>
        <endpointBehaviors>
        <behavior name="EndBehavior">
            <webHttp />
        </behavior>
    </endpointBehaviors>
    <serviceBehaviors>
        <behavior name="ServiceBehavior">
            <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
            <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
    </serviceBehaviors>
    </behaviors>
    <services>
        <service behaviorConfiguration="ServiceBehavior" name="ApiService">
            <endpoint address="basic" binding="webHttpBinding" contract="IApiService" behaviorConfiguration="EndBehavior"/>
        </service>
        <service behaviorConfiguration="ServiceBehavior" name="WebService">
            <endpoint address="" binding="webHttpBinding" contract="IWebService" behaviorConfiguration="EndBehavior"/>
        </service>
    </services>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
</system.serviceModel>

ウィンドウ アプリケーション

サービス参照として localhost:5151/ApiService.svc を追加

Index.cs

try {
    Localhost.ApiServiceClient client = new Localhost.ApiServiceClient();
    client.TestConnection();
}
catch(Exception ex) {
    Log.Exception(ex);
}

App.config

<system.serviceModel>
    <behaviors>
        <serviceBehaviors>
                <behavior name="ServiceBehavior">
                    <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
                    <serviceDebug includeExceptionDetailInFaults="true"/>
                </behavior>
        </serviceBehaviors>
        <endpointBehaviors>
            <behavior name="EndBehavior">
                <webHttp/>
            </behavior>
        </endpointBehaviors>
    </behaviors>
    <client>
        <endpoint address="http://localhost:5151/ApiService.svc" behaviorConfiguration="EndBehavior" binding="webHttpBinding" contract="Localhost.IApiService" name="ApiServiceClient" />
    </client>
</system.serviceModel>

私が得ることができる最新のエラーは

Message : 
    Operation 'IsPhoneNumberListMatch' of contract 'IApiService' specifies multiple request body parameters to be serialized without any wrapper elements. At most one body parameter can be serialized without wrapper elements. Either remove the extra body parameters or set the BodyStyle property on the WebGetAttribute/WebInvokeAttribute to Wrapped.
Stack trace :
    at System.ServiceModel.Description.WebHttpBehavior.TryGetNonMessageParameterType(MessageDescription message, OperationDescription declaringOperation, Boolean isRequest, Type& type)
    at System.ServiceModel.Description.WebHttpBehavior.ValidateBodyStyle(OperationDescription operation, Boolean request)
    at System.ServiceModel.Description.WebHttpBehavior.<>c__DisplayClass7.<>c__DisplayClassa.<GetRequestClientFormatter>b__4()
    at System.ServiceModel.Description.WebHttpBehavior.<>c__DisplayClass7.<GetRequestClientFormatter>b__3()
    at System.ServiceModel.Description.WebHttpBehavior.HideReplyMessage(OperationDescription operationDescription, Effect effect)
    at System.ServiceModel.Description.WebHttpBehavior.GetRequestClientFormatter(OperationDescription operationDescription, ServiceEndpoint endpoint)
    at System.ServiceModel.Description.WebHttpBehavior.ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    at System.ServiceModel.Description.DispatcherBuilder.ApplyClientBehavior(ServiceEndpoint serviceEndpoint, ClientRuntime clientRuntime)
    at System.ServiceModel.Description.DispatcherBuilder.BuildProxyBehavior(ServiceEndpoint serviceEndpoint, BindingParameterCollection& parameters)
    at System.ServiceModel.Channels.ServiceChannelFactory.BuildChannelFactory(ServiceEndpoint serviceEndpoint, Boolean useActiveAutoClose)
    at System.ServiceModel.ChannelFactory.CreateFactory()
    at System.ServiceModel.ChannelFactory.OnOpening()
    at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
    at System.ServiceModel.ChannelFactory.EnsureOpened()
    at System.ServiceModel.ChannelFactory`1.CreateChannel(EndpointAddress address, Uri via)
    at System.ServiceModel.ChannelFactory`1.CreateChannel()
    at System.ServiceModel.ClientBase`1.CreateChannel()
    at System.ServiceModel.ClientBase`1.CreateChannelInternal()
    at System.ServiceModel.ClientBase`1.get_Channel()
    at LoonTeleShopClient.Localhost.ApiServiceClient.TestConnection() in c:\Users\Kelvin\Documents\Visual Studio 2012\Projects\LoonTeleShopClient\LoonTeleShopClient\Service References\Localhost\Reference.cs:line 339
    at LoonTeleShopClient.Index..ctor() in c:\Users\Kelvin\Documents\Visual Studio 2012\Projects\LoonTeleShopClient\LoonTeleShopClient\Index.cs:line 44

助けてください~~~百万ありがとう

4

1 に答える 1

0

これはあなたが望んでいた答えではないかもしれませんが、非 SOAP バインディングを提供する必要がある場合は、操作に複数のパラメーターを持たないことをお勧めします。これの主な理由は、"Bare" bodyStyle のみを使用することで、優れたヘルプ ページを取得できることです。設定してみてください:

<behaviors>
  <endpointBehaviors>
    <behavior name="EndBehavior">
      <webHttp automaticFormatSelectionEnabled="true" defaultBodyStyle="Bare" helpEnabled="true"/>
    </behavior>
  </endpointBehaviors>
</behaviors>

この意志:

  1. json または xml を使用して通信するかどうかをユーザーが決定できるようにする
    (automaticFormatSelectionEnabled)
  2. デフォルトの BodyStyle を設定する
  3. ヘルプページを有効にする

これを行うと、すべての WebInvoke 属性を削除できます: [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]

ヘルプ ページは http://your.domain/servicename/endpointAddress/help にあります。たとえば、service.motor.car に Engine.svc というサービスがあり、エンドポイント アドレスが「v1/web」の場合、http://service.motor.car/Engine.svc/v1/web/helpで私のヘルプページを見つけてください

お役に立てれば :-)

よろしくデシベル

于 2013-08-28T14:49:53.573 に答える