Вы также можете передать дополнительные параметры в URI, как в примере ниже. Или вы можете передать их как заголовки HTTP и получить их, используя свойство WebOperationContext.Current.IncomingRequest.Headers
.
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "UploadImages/{fileName}?imageId={imageID}")]
public void UploadImages(int imageID, string fileName, Stream image)
{
}
Обновление
Даже если тип параметра является массивом, вы также можете передать его в строке запроса - но вам нужно будет указать QueryStringConverter
, который может декодировать этот тип. Пример ниже показывает, что.
public class StackOverflow_6905108
{
[ServiceContract]
public class Service
{
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "UploadImages/{fileName}?array={array}")]
public void UploadImages(int[] array, string fileName, Stream image)
{
Console.WriteLine("Array:");
foreach (var item in array) Console.Write("{0} ", item);
Console.WriteLine();
}
}
public static void SendPost(string uri, string contentType, string body)
{
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(uri);
req.Method = "POST";
req.ContentType = contentType;
Stream reqStream = req.GetRequestStream();
byte[] reqBytes = Encoding.UTF8.GetBytes(body);
reqStream.Write(reqBytes, 0, reqBytes.Length);
reqStream.Close();
HttpWebResponse resp;
try
{
resp = (HttpWebResponse)req.GetResponse();
}
catch (WebException e)
{
resp = (HttpWebResponse)e.Response;
}
Console.WriteLine("HTTP/{0} {1} {2}", resp.ProtocolVersion, (int)resp.StatusCode, resp.StatusDescription);
foreach (string headerName in resp.Headers.AllKeys)
{
Console.WriteLine("{0}: {1}", headerName, resp.Headers[headerName]);
}
Console.WriteLine();
Stream respStream = resp.GetResponseStream();
Console.WriteLine(new StreamReader(respStream).ReadToEnd());
Console.WriteLine();
Console.WriteLine(" *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* ");
Console.WriteLine();
}
class MyQueryStringConverter : QueryStringConverter
{
QueryStringConverter originalConverter;
public MyQueryStringConverter(QueryStringConverter originalConverter)
{
this.originalConverter = originalConverter;
}
public override bool CanConvert(Type type)
{
return type == typeof(int[]) || base.CanConvert(type);
}
public override object ConvertStringToValue(string parameter, Type parameterType)
{
if (parameterType == typeof(int[]))
{
return parameter.Split(',').Select(x => int.Parse(x)).ToArray();
}
else
{
return base.ConvertStringToValue(parameter, parameterType);
}
}
}
public class MyWebHttpBehavior : WebHttpBehavior
{
protected override QueryStringConverter GetQueryStringConverter(OperationDescription operationDescription)
{
return new MyQueryStringConverter(base.GetQueryStringConverter(operationDescription));
}
}
public static void Test()
{
string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
host.AddServiceEndpoint(typeof(Service), new WebHttpBinding(), "").Behaviors.Add(new MyWebHttpBehavior());
host.Open();
Console.WriteLine("Host opened");
SendPost(baseAddress + "/UploadImages/a.txt?array=1,2,3,4", "application/octet-stream", "The file contents");
Console.Write("Press ENTER to close the host");
Console.ReadLine();
host.Close();
}
}