2

私の最近のC#コーディングのベンチャーは、WCFサービスについて学ぶことです。とてもシンプルなサービスを作ろうとしています。デフォルトではないメソッドが1つあり、ユーザーが入力した整数に2を掛けた文字列を返すだけです。サービスをaspspider.comにアップロードし、winformsクライアントアプリを作成しました。ただし、サービスクラスを調べると、GetDataメソッドのみが表示されます。私はこれに正直に戸惑い、私の方法が表示されない理由を一生理解できません。コマンドラインからsvcutil.exeコマンドを使用しましたが、まだ何も使用していません。誰かが私を助けてくれるなら、私は本当に感謝しています!これが私のコードです:

サービスコード:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using System.Web.Services;

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

        public string GetDouble(int value) //Method that isn't showing up
        {
            return (value * 2).ToString();
        }
     }
  }

サービスインターフェイス:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

namespace WcfService1
{
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        string GetData(int value);

        [OperationContract]
        public string GetDouble(int value); //Method that isn't showing up

        // TODO: Add your service operations here
    }   
}

Service1Client(これは厄介であることに注意してください。まだここでコードをフォーマットする方法を理解しようとしています):

namespace WcfService1
{
    using System.Runtime.Serialization;

    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
    [System.Runtime.Serialization.DataContractAttribute(Name="CompositeType", Namespace="http://schemas.datacontract.org/2004/07/WcfService1")]
    public partial class CompositeType : object, System.Runtime.Serialization.IExtensibleDataObject
    {
        private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
        private bool BoolValueField;
        private string StringValueField;

        public System.Runtime.Serialization.ExtensionDataObject ExtensionData
        {
            get
            {
                return this.extensionDataField;
            }
            set
            {
                this.extensionDataField = value;
            }
        }

        [System.Runtime.Serialization.DataMemberAttribute()]
        public bool BoolValue
        {
            get
            {
                return this.BoolValueField;
            }
            set
            {
                this.BoolValueField = value;
            }
        }

        [System.Runtime.Serialization.DataMemberAttribute()]
        public string StringValue
        {
            get
            {
                return this.StringValueField;
            }
            set
            {
                this.StringValueField = value;
            }
        }
    }
}

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(ConfigurationName="IService1")]
public interface IService1
{
    [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/GetData", ReplyAction="http://tempuri.org/IService1/GetDataResponse")]
    string GetData(int value);
    [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/GetDataUsingDataContract", ReplyAction="http://tempuri.org/IService1/GetDataUsingDataContractResponse")]
    WcfService1.CompositeType GetDataUsingDataContract(WcfService1.CompositeType composite);
}

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
public interface IService1Channel : IService1, System.ServiceModel.IClientChannel
{
}

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
public partial class Service1Client : System.ServiceModel.ClientBase<IService1>, IService1
{
    public Service1Client()
    {
    }

    public Service1Client(string endpointConfigurationName) : 
            base(endpointConfigurationName)
    {
    }

    public Service1Client(string endpointConfigurationName, string remoteAddress) : 
            base(endpointConfigurationName, remoteAddress)
    {
    }

    public Service1Client(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
            base(endpointConfigurationName, remoteAddress)
    {
    }

    public Service1Client(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
            base(binding, remoteAddress)
    {
    }

    public string GetData(int value)
    {
        return base.Channel.GetData(value);
    }

    public WcfService1.CompositeType GetDataUsingDataContract(WcfService1.CompositeType composite)
    {
        return base.Channel.GetDataUsingDataContract(composite);
    }
}

クライアント:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WebServiceTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Service1Client client = new Service1Client();
            client.Open();
            label1.Text = client.GetData(5);
            client.Close();
        }
    }
}
4

4 に答える 4

11

これも正しくコンパイルされていますか?インターフェイスは、その中のメソッドの可視性を宣言できません。それらは暗黙的に公開されています。したがって、この;

[OperationContract]
public string GetDouble(int value);

これである必要があります。

[OperationContract]
string GetDouble(int value);
于 2013-01-30T03:16:09.297 に答える
1

問題を修正しました。どうやら私は変更をコンパイルするのを忘れていました。助けてくれてありがとう!

于 2013-01-30T18:46:28.383 に答える
0

以下に示すように、操作コントラクトからアクセス修飾子を削除します。

string GetData(int value)
{
    return string.Format("You entered: {0}", value);
}
string GetDouble(int value) 
{
    return (value * 2).ToString();
}
于 2013-01-30T12:38:26.187 に答える