gpt4 book ai didi

wcf - 在 RESTful WCF 服务中将类作为参数传递

转载 作者:行者123 更新时间:2023-12-02 09:25:50 25 4
gpt4 key购买 nike

在我的 RESTful WCF 服务中,我需要传递一个类作为 URITemplate 的参数。我能够传递一个或多个字符串作为参数。但我有很多字段要传递给 WCF 服务。所以我创建了一个类并将所有字段添加为属性,然后我想将此类作为 URITemplate 的一个参数传递。当我尝试将类传递给 URITemplate 时,出现错误“路径段必须具有字符串类型”。它不接受类作为参数。知道如何将类作为参数传递。这是我的代码(inputData 是类)

<小时/>
    [OperationContract]
[WebGet(UriTemplate = "/InsertData/{param1}")]
string saveData(inputData param1);

最佳答案

您实际上可以在 GET 请求中传递复杂类型(类),但您需要通过 QueryStringConverter“教导”WCF 如何使用它。但是,您通常不应该这样做,尤其是在会更改服务中某些内容的方法中(GET 应该用于只读操作)。

下面的代码显示了在 GET(使用自定义 QueryStringConverter)和 POST(它应该完成的方式)中传递复杂类型。

public class StackOverflow_6783264
{
public class InputData
{
public string FirstName;
public string LastName;
}
[ServiceContract]
public interface ITest
{
[OperationContract]
[WebGet(UriTemplate = "/InsertData?param1={param1}")]
string saveDataGet(InputData param1);
[OperationContract]
[WebInvoke(UriTemplate = "/InsertData")]
string saveDataPost(InputData param1);
}
public class Service : ITest
{
public string saveDataGet(InputData param1)
{
return "Via GET: " + param1.FirstName + " " + param1.LastName;
}
public string saveDataPost(InputData param1)
{
return "Via POST: " + param1.FirstName + " " + param1.LastName;
}
}
public class MyQueryStringConverter : QueryStringConverter
{
public override bool CanConvert(Type type)
{
return (type == typeof(InputData)) || base.CanConvert(type);
}
public override object ConvertStringToValue(string parameter, Type parameterType)
{
if (parameterType == typeof(InputData))
{
string[] parts = parameter.Split(',');
return new InputData { FirstName = parts[0], LastName = parts[1] };
}
else
{
return base.ConvertStringToValue(parameter, parameterType);
}
}
}
public class MyWebHttpBehavior : WebHttpBehavior
{
protected override QueryStringConverter GetQueryStringConverter(OperationDescription operationDescription)
{
return new MyQueryStringConverter();
}
}
public static void Test()
{
string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
host.AddServiceEndpoint(typeof(ITest), new WebHttpBinding(), "").Behaviors.Add(new MyWebHttpBehavior());
host.Open();
Console.WriteLine("Host opened");

WebClient client = new WebClient();
Console.WriteLine(client.DownloadString(baseAddress + "/InsertData?param1=John,Doe"));

client = new WebClient();
client.Headers[HttpRequestHeader.ContentType] = "application/json";
Console.WriteLine(client.UploadString(baseAddress + "/InsertData", "{\"FirstName\":\"John\",\"LastName\":\"Doe\"}"));

Console.Write("Press ENTER to close the host");
Console.ReadLine();
host.Close();
}
}

关于wcf - 在 RESTful WCF 服务中将类作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6783264/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com