2
在我的REST WCF服務中,我傳遞了近15個參數。我通過這些參數在這樣的URL:在Rest Wcf服務中傳遞參數
www.mysite.com/wcfservice/mymethod/{p1},{p2},{p3},{p4}...
有沒有更好的方式傳遞參數?在URL中傳遞參數是否會導致任何安全問題(如SQL注入)?使用XML文件傳遞參數是否明智?在REST WCF服務中傳遞資源的最佳方式是什麼?
在我的REST WCF服務中,我傳遞了近15個參數。我通過這些參數在這樣的URL:在Rest Wcf服務中傳遞參數
www.mysite.com/wcfservice/mymethod/{p1},{p2},{p3},{p4}...
有沒有更好的方式傳遞參數?在URL中傳遞參數是否會導致任何安全問題(如SQL注入)?使用XML文件傳遞參數是否明智?在REST WCF服務中傳遞資源的最佳方式是什麼?
假設你的方法是Idempotent(即GET),看起來你知道你不能使用身體進行轉移。所以你留下的URL和頭。
在標題中放入與上述特定請求不相關的信息 - 例如,您的ProtocolVersion,SystemName - 並解析服務中的這些標頭。
在URL中放置了上下文相關的參數,這些參數是您執行操作所必需的:例如, EntityId,FilterValue。
如果您傳遞一個參數的列表 - 例如value1 = 1,2,3 - 那麼你可以考慮使用一個自定義的QueryString轉換器(見下面 - 將行爲附加到Endpoint是另一個練習)。
最後,您可能只需要傳遞許多參數。基於搜索的操作非常普遍,其中可能有多種維度可供搜索。
using System;
using System.Linq;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
public class CustomQueryStringConverter : QueryStringConverter
{
public override bool CanConvert(Type type)
{
return base.CanConvert(type.IsArray ? type.GetElementType() : type);
}
public override object ConvertStringToValue(string parameter, Type parameterType)
{
object result = null;
if (parameterType.IsArray)
{
if (!ReferenceEquals(parameter, null))
{
object[] items = parameter
.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
.Where(s => !string.IsNullOrWhiteSpace(s))
.Select(s => base.ConvertStringToValue(s.Trim(), parameterType.GetElementType()))
.ToArray();
Array arrayResult = Array.CreateInstance(parameterType.GetElementType(), items.Length);
for (int i = 0; i < items.Length; ++i)
{
arrayResult.SetValue(items[i], i);
}
result = arrayResult;
}
}
else
{
result = base.ConvertStringToValue(parameter, parameterType);
}
return result;
}
public override string ConvertValueToString(object parameter, Type parameterType)
{
string result = string.Empty;
if (parameterType.IsArray)
{
foreach (object item in (Array)parameter)
{
result += item.ToString() + ",";
}
result = result.TrimEnd(',');
}
else
{
result = base.ConvertValueToString(parameter, parameterType);
}
return result;
}
public class CustomQueryStringBehavior : WebHttpBehavior
{
protected override QueryStringConverter GetQueryStringConverter(OperationDescription operationDescription)
{
return new CustomQueryStringConverter();
}
}
}
爲什麼不使用Post和像Json這樣的數據傳輸格式。 Xml也很好,但Json通常更好。 –
不是很好的uri模板。一些標準驗證應該防止任何SQL注入。我同意最好將某些媒體作爲json或xml發送,並調整uri模板。另外一個設計問題是P1,...,pi相關 - 他們是否一起構建了一個對象?如果是這樣 - 你還有一個重新設計的理由。 –
嗨doc - 我使用POST方法只發布這些參數 – Henry