здесь я могу видеть, что тайм-аут был добавлен недавно
, убедитесь, что startTimeout> 0, иначе вы будете ждать (0) или ждать (-n) это вероятно причиной IllegalMonitorStateException
РЕДАКТИРОВАТЬ: ОК, выше, это катастрофа, но давайте попробуем это:
мы в конструкторе Mux: http://svn.apache.org /viewvc/river/jtsk/trunk/src/com/sun/jini/jeri/internal/mux/Mux.java?view=markup
в строке 176 мы создаем SocketChannelConnectionIO и передаем это после этого мы сломать и и другая нить вступает во владение.
в конструкторе SocketChannelConnectionIO, определенном здесь: http://svn.apache.org/viewvc/river/jtsk/trunk/src/com/sun/jini/jeri/internal/mux/SocketChannelConnectionIO. java? view = markup строка 112 мы регистрируем на канал с новым обработчиком ().
Обработчик возвращает что-то по каналу, и функция, скажем, выполняется функция handleReadReady, мы синхронизируемся по muxLock.
Теперь мы все еще в конструкторе, поэтому объект в финале все еще изменчив! давайте предположим, что это изменится, теперь у нас есть что-то, ожидающее на другом muxLock
Сценарий один на миллион
РЕДАКТИРОВАТЬ
Mux(SocketChannel channel,
int role, int initialInboundRation, int maxFragmentSize)
throws IOException
{
this.role = role;
if ((initialInboundRation & ~0x00FFFF00) != 0) {
throw new IllegalArgumentException(
"illegal initial inbound ration: " +
toHexString(initialInboundRation));
}
this.initialInboundRation = initialInboundRation;
this.maxFragmentSize = maxFragmentSize;
//LINE BELOW IS CAUSING PROBLEM it passes this to SocketChannelConnectionIO
this.connectionIO = new SocketChannelConnectionIO(this, channel);
//Lets assume it stops here we are still in constructor
//and we are not in synchronized block
directBuffersUseful = true;
}
теперь в конструкторе SocketChannelConnectionIO http://svn.apache.org/viewvc/river/jtsk/trunk/src/com/sun/jini/jeri/internal/mux/SocketChannelConnectionIO.java?revision=1069292&view = co
SocketChannelConnectionIO(Mux mux, SocketChannel channel)
throws IOException
{
super(mux);
channel.configureBlocking(false);
this.channel = channel;
//Line below we are registering to the channel with mux that is still mutable
//this is the line that actually is causing the problem move that to
// start() and it should work
key = selectionManager.register(channel, new Handler());
}
переместить этот код в start () должно работать key = selectionManager.register(channel, new Handler());
(я предполагаю, что start is executet, когда мы хотим начать обработку)
/**
* Starts processing connection data.
*/
void start() throws IOException {
key = selectionManager.register(channel, new Handler());
key.renewInterestMask(SelectionKey.OP_READ);
}
Но было бы намного лучше не создавать SocketChannelConnectionIO в конструкторе mux, но может быть где-то после этого то же самое для второго конструктора, создающего StreamConnectionIO с этим
Веб-сервисы, особенно SOAP, ожидают таких вещей, как XML-конверт с деталями вызова. Лучше использовать HttpHandler
.
Что-то вроде this:
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Web;
public class ImageHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
int width = int.Parse(context.Request.QueryString["width"]);
int height = int.Parse(context.Request.QueryString["height"]);
using (Bitmap bitmap = new Bitmap(width,height)) {
...
using (MemoryStream mem = new MemoryStream()) {
bitmap.Save(mem,ImageFormat.Png);
mem.Seek(0,SeekOrigin.Begin);
context.Response.ContentType = "image/png";
mem.CopyTo(context.Response.OutputStream,4096);
context.Response.Flush();
}
}
}
}
Это, конечно, очень грубо. Тогда вы бы назвали это:
<img src="myhandler.ashx?width=10&height=10"/>
Веб-служба для этого не подходит. Он возвращает сообщение в определенном формате, обычно SOAP, поэтому это не может быть изображение.
Вместо этого используйте обычную веб-форму, в которой вы удаляете всю разметку, кроме директивы @page
. Используйте метод BinaryWrite
для записи данных изображения в поток ответа.
Пример:
byte[] imageData;
using (Bitmap image = new Bitmap(10,10)) {
using (Graphics g = Graphics.FromImage(image)) {
g.Clear(Color.Red);
}
using (MemoryStream m = new MemoryStream()) {
image.Save(m, ImageFormat.Png);
imageData = m.ToArray();
}
}
Response.ContentType = "image/png";
Response.BinaryWrite(imageData);
Я думаю, что ответ @Lloyd - хорошее начало.
У меня были проблемы с альфа-прозрачностью и PNG: Можно ли сделать альфа-прозрачный PNG с помощью C #?
Невозможно вывести изображение из WebService.
Проверьте это: http://www.c-sharpcorner.com/UploadFile/gnsrinivas1511/Webservice05112009034709AM/Webservice.aspx
Кроме того, в зависимости от того, как вы это реализуете, имейте в виду, что вы можете настроить себя для атаки DOS. Создание изображений - не самая удобная для процессора вещь. Убедитесь, что у вас есть механизм аутентификации и / или кэширования, чтобы облегчить эту потенциальную проблему.